>

이 글을 쓸 수있는 사람이 있습니까?

ruby-1.8.7-p302 > a = %w( a b c)
 => ["a", "b", "c"] 
ruby-1.8.7-p302 > while (i = a.shift) do; puts i ; end
a
b
c
 => nil

동안 블록을 전달하는 것 같습니다. 그리고 아닙니다 :

while(i = a.shift) { puts i; }

while 구문의 "do"는 구문 설탕 일 뿐이고 블록의 "do"와 관련이 없기 때문입니까?

  • 답변 # 1

    와이즈 비즈 와이즈 비즈  

    Is it because the 의  구문은 단지 구문 설탕이며 do 와 관련이 없습니다.  블록?

    더 많거나 적습니다. 그것은 구문 설탕이 아니며 while 와 같은 내장 언어 구조입니다.  또는 do @meagar가 이미 쓴 것처럼

    def 와는 아무 상관이 없습니다  키워드가 비싸므로 키워드를 재사용하는 것이 합리적이라는 점을 제외하고는 "비싸다"는 말로 프로그래머의 표현력을 제한한다는 의미입니다.

    class 에서  루프에서 블록을 조건과 분리하는 두 가지 방법이 있습니다.

    <올>

    와이즈 비즈  키워드 및

    표현식 구분 기호

    Ruby에는 두 개의 다른 표현식 구분 기호가 있습니다 :

    <올> 세미콜론 do  그리고

    줄 바꿈

    따라서 다음 세 가지 모두 유효합니다.

    while
    
    

    [분명히, 마지막 것은 그렇게 작성되지 않았을 것입니다.  새로운 라인에, do 와 일치하는 것으로 간주 . 나는 단지 ; 의 부분을 분리하는 데 필요한 최소값을 보여주고 싶었습니다.  루프.]

    그건 그렇고 : 조건을 괄호 안에 넣는 것은 관용적이지 않습니다. 코드에는 불필요한 세미콜론이 많이 있습니다. 변수 이름 while i = a.shift do puts i end # do while i = a.shift; puts i end # semicolon while i = a.shift puts i end # newline  일반적으로 요소가 아닌 인덱스 용으로 예약되어 있습니다. (저는 보통 end 를 사용합니다  일반적인 요소의 경우 더 많은 의미 이름을 선호합니다.)

    컬렉션을 수동으로 반복하는 것은 관용적이지 않습니다. 귀하의 코드는 다음과 같이 작성하는 것이 훨씬 좋습니다.

    while
    
    

    이것의 기능을 이해하는 것이 훨씬 쉬울뿐만 아니라 (어레이의 모든 요소를 ​​인쇄하고 그로부터 모든 항목을 삭제하는 것) 쓰기가 훨씬 쉽습니다 (종료 조건을 잘못 잡을 방법이 없습니다, 또는 나사 모든 과제). 또한보다 효율적입니다. 버전이 Θ (n2)이며이 버전은 Θ (n)입니다.

    실제로 그것은 while 때문에  어쨌든 이미 그 동작을 구현하고 있습니다. 따라서실제쓰는 것은 이것입니다

    i
    
    

    아마도 이것

    el
    
    

    [참고 :이 마지막 것은 100 % 동일하지 않습니다. 빈 배열의 개행을 인쇄하고 다른 배열은 아무것도 인쇄하지 않습니다.]

    간단합니다. 명확한. 간결한. 나타내는. 빠릅니다.

    와 비교 :

    a.each(&method(:puts)).clear
    
    

    실제로 100 % 명확하게하기 위해 여러 번 실행해야했습니다.

  • 답변 # 2

    Kernel#puts  블록을 사용하지 않고 언어 구성입니다. 와이즈 비즈  선택 사항입니다 :

    puts a
    a.clear
    
    

    a.tap(&method(:puts)).clear

  • 이전 기본 유형을 둘러싼 C ++ 클래스 래퍼
  • 다음 kerberos - 브라우저가 NTLM 자격 증명을 보내지 못하게하는 방법은 무엇입니까?