루비에 "do… while"루프가 있습니까?
이 코드를 사용하여 사용자가 이름을 입력 할 수있게하고 프로그램은 빈 문자열을 입력 할 때까지 배열에 저장합니다 (각 이름 다음에 Enter 키를 눌러야 함).
people = []
info = 'a' # must fill variable with something, otherwise loop won't execute
while not info.empty?
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end
이 코드는 do ... while 루프에서 훨씬 멋지게 보입니다.
people = []
do
info = gets.chomp
people += [Person.new(info)] if not info.empty?
while not info.empty?
이 코드에서는 임의의 문자열에 정보를 할당 할 필요가 없습니다.
불행히도이 유형의 루프는 Ruby에 존재하지 않는 것 같습니다. 아무도 이것을하는 더 좋은 방법을 제안 할 수 있습니까?
주의 :
은 begin <code> end while <condition>
루비의 저자 마츠에 의해 거부됩니다. 대신 그는 사용 제안 Kernel#loop
예를 들어,
loop do
# some code here
break if <condition>
end
다음 은 Matz가 말하는 2005 년 11 월 23 일 의 이메일 교환 입니다.
|> Don't use it please. I'm regretting this feature, and I'd like to
|> remove it in the future if it's possible.
|
|I'm surprised. What do you regret about it?
Because it's hard for users to tell
begin <code> end while <cond>
works differently from
<code> while <cond>
RosettaCode 위키 는 비슷한 이야기를합니다 :
2005 년 11 월 Ruby 제작자 인 Matsumoto Yukihiro는이 루프 기능을 후회하고 Kernel # loop 사용을 제안했습니다.
Tempfile#initialize
Ruby 코어 라이브러리에서 소스를 읽는 동안 다음 스 니펫을 발견했습니다 .begin tmpname = File.join(tmpdir, make_tmpname(basename, n)) lock = tmpname + '.lock' n += 1 end while @@cleanlist.include?(tmpname) or File.exist?(lock) or File.exist?(tmpname)
언뜻보기에는 while 수정자가 begin ... end의 내용보다 먼저 평가 될 것이라고 가정했지만 실제로는 그렇지 않습니다. 관찰 :
>> begin ?> puts "do {} while ()" >> end while false do {} while () => nil
예상 한대로 수정자는 true 인 동안 루프는 계속 실행됩니다.
>> n = 3 => 3 >> begin ?> puts n >> n -= 1 >> end while n > 0 3 2 1 => nil
이 관용구를 다시는 볼 수 없어서 기쁘 겠지만 시작 ... 끝은 아주 강력합니다. 다음은 매개 변수없이 단일 라이너 방법을 기억하는 일반적인 관용구입니다.
def expensive @expensive ||= 2 + 2 end
더 복잡한 것을 기억하기위한 추악하지만 빠른 방법은 다음과 같습니다.
def expensive @expensive ||= begin n = 99 buf = "" begin buf << "#{n} bottles of beer on the wall\n" # ... n -= 1 end while n > 0 buf << "no more bottles of beer" end end
Jeremy Voorhis가 처음 썼습니다 . 원래 사이트에서 삭제 된 것으로 보이므로 여기에 내용이 복사되었습니다. 웹 아카이브 및 Ruby Buzz 포럼 에서도 사본을 찾을 수 있습니다 . -도마뱀 빌
이처럼 :
people = []
begin
info = gets.chomp
people += [Person.new(info)] if not info.empty?
end while not info.empty?
참조 : Ruby 's Hidden은 {} while () 루프를 수행합니다.
이건 어때?
people = []
until (info = gets.chomp).empty?
people += [Person.new(info)]
end
다음은 hubbardr의 데드 링크 내 블로그에 대한 전체 텍스트 기사입니다.
Tempfile#initialize
Ruby 코어 라이브러리에서 소스를 읽는 동안 다음 스 니펫을 발견했습니다 .
begin
tmpname = File.join(tmpdir, make_tmpname(basename, n))
lock = tmpname + '.lock'
n += 1
end while @@cleanlist.include?(tmpname) or
File.exist?(lock) or File.exist?(tmpname)
언뜻보기에 while
수정자는의 내용보다 먼저 평가 될 것이라고 가정 begin...end
했지만 그렇지 않습니다. 관찰 :
>> begin
?> puts "do {} while ()"
>> end while false
do {} while ()
=> nil
예상 한대로 수정자는 true 인 동안 루프는 계속 실행됩니다.
>> n = 3
=> 3
>> begin
?> puts n
>> n -= 1
>> end while n > 0
3
2
1
=> nil
나는이 관용구를 다시 begin...end
는 볼 수 없을 것이지만 매우 강력합니다. 다음은 매개 변수없이 단일 라이너 방법을 기억하는 일반적인 관용구입니다.
def expensive
@expensive ||= 2 + 2
end
더 복잡한 것을 기억하기위한 추악하지만 빠른 방법은 다음과 같습니다.
def expensive
@expensive ||=
begin
n = 99
buf = ""
begin
buf << "#{n} bottles of beer on the wall\n"
# ...
n -= 1
end while n > 0
buf << "no more bottles of beer"
end
end
이것은 지금 올바르게 작동합니다 :
begin
# statment
end until <condition>
그러나이 begin
진술은 반 직관적 이기 때문에 향후에 제거 될 수 있습니다 . 참조 : http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/6745
Matz (Ruby 's Creator)는 다음과 같이 권장합니다.
loop do
# ...
break if <condition>
end
내가 수집 한 것에서 Matz는 구조물을 좋아하지 않습니다.
begin
<multiple_lines_of_code>
end while <cond>
의미론이 다르기 때문에
<single_line_of_code> while <cond>
첫 번째 구문은 조건을 확인하기 전에 먼저 코드를 실행하고 두 번째 구문은 코드를 실행하기 전에 조건을 먼저 테스트합니다 (있는 경우). Matz는 if 문의 한 줄 구문과 일치하기 때문에 두 번째 구문을 유지하는 것을 선호합니다.
if 문에 대해서도 두 번째 구문을 좋아하지 않았습니다. 다른 모든 경우에 컴퓨터는 왼쪽에서 오른쪽으로 코드를 실행합니다 (예 : || 및 &&). 인간은 왼쪽에서 오른쪽으로 위에서 아래로 코드를 읽습니다.
대신 다음과 같은 구성을 제안합니다.
if <cond> then <one_line_code> # matches case-when-then statement
while <cond> then <one_line_code>
<one_line_code> while <cond>
begin <multiple_line_code> end while <cond> # or something similar but left-to-right
그 제안이 나머지 언어와 구문 분석되는지는 모르겠습니다. 그러나 어쨌든 나는 언어 일관성뿐만 아니라 왼쪽에서 오른쪽으로 실행하는 것을 선호합니다.
a = 1
while true
puts a
a += 1
break if a > 10
end
여기 또 다른 것이 있습니다.
people = []
1.times do
info = gets.chomp
unless info.empty?
people += [Person.new(info)]
redo
end
end
ppl = []
while (input=gets.chomp)
if !input.empty?
ppl << input
else
p ppl; puts "Goodbye"; break
end
end
참고 URL : https://stackoverflow.com/questions/136793/is-there-a-do-while-loop-in-ruby
'Programing' 카테고리의 다른 글
JavaScript에서 문자열 보간을 어떻게 수행 할 수 있습니까? (0) | 2020.02.17 |
---|---|
문자열에서 모든 문자를 바꾸는 방법? (0) | 2020.02.17 |
유형에 대해 JSON.NET 오류 자체 참조 루프가 발견되었습니다. (0) | 2020.02.17 |
여러 파일의 확장자를 어떻게 바꾸나요? (0) | 2020.02.17 |
'new'연산자와 함께 .apply () 사용. (0) | 2020.02.17 |