2011-06-14 4 views
26

저는 Ruby를 처음 접하면서도 언어 디자인 원칙을 이해하려고 노력하고 있습니다. 내가 정상적으로 처리했다면 루비의 람다 식 호출은 대괄호로 묶여 있어야하고, "일반"함수 호출은 "보통"/ 둥근 괄호가 있어야합니다.람다 대 함수 호출 또는 호출 - Ruby의 구문이 다릅니다. 왜?

구문이 다른 특별한 이유가 있습니까? 즉 호출자가 함수를 호출하거나 람다 식을 적용하는지 여부를 알고 있어야합니다 (이유).

답변

23

Ruby에서 메서드는 lambda가 아니기 때문에 (예 : JavaScript에서와 같이).

메소드는 항상 객체에 속하며 (하위 클래스 또는 혼합으로) 상속 될 수 있으며 객체의 고유 클래스에서 덮어 쓸 수 있으며 블록 (람다)을 제공 할 수 있습니다. 변수에 대한 자체 범위가 있습니다. 예 방법 정의 : 람다가/발동 일반 폐쇄는, 어쩌면 변수에 저장되지 않습니다 그러나

a = :some_variable 
def some_method 
    # do something, but not possible to access local variable a 
end 

# call with: 
some_method 

- 아무것도 :

a = :some_variable 
some_lambda = lambda{ 
    # do something, access local variable a if you want to 
} 

# call with: 
some_lambda[] 

루비가 결합 모두 예를 들어, 강력한 구문 접근을 차단 통과 :

def some_method_with_block(a) 
    # do something, call given block (which is a lambda) with: 
    yield(a) ? 42 : 21 
end 

# example call: 
some_method_with_block(1) do |x| 
    x.odd? 
end #=> 42 
+0

고마워요! 네, JavaScript는 내가 염두에 두었던 반대 사례였습니다! 내가 무슨 뜻인지 알지만 블록에 대한 모범을 보일 때 완벽 할 것입니다. 아직 답을 찾지 못했다고 생각합니다 :) – BreakPhreak

+2

의견을 보내 주셔서 감사 드리며 일부 코드 조각을 추가했습니다 :) –

+0

perfect! 고맙습니다 - 더 많은 것을 기대하고 더 많이 기대했습니다 :) – BreakPhreak

26

일반 Ruby 메서드 호출은 블록 용 중괄호가 아닌 ()을 사용합니다. 람다 호출에 대해 []이 마음에 들지 않으면 언제든지 call 메서드를 사용할 수 있습니다.

예 : 또한 루비의 최신 버전에서

>> by_two = lambda { |x| x * 2 } #=> #<Proc:[email protected](irb):1> 
>> by_two[5] #=> 10 
>> by_two.call(5) #=> 10 

편집

:

>> by_two.(5) #=> 10 

루비는 bareword는을 볼 때 당신은 단지, by_two(5)을 할 수없는 이유에 먼저 로컬 변수로 해석하고 메소드로 실패한 경우이를 시도합니다.

+0

[1] 내 질문에 수정되었습니다 : '둥근 괄호'대신 '둥근 괄호'. 내 잘못이야. [2]'by_two'가 변수로 먼저 해석된다고 가정하십시오. 그 이유는 단순히 기술 (파서를 조정)한다는 의미입니까? 람다 호출과 함수 호출 또는 어떤 것에 나타날 수있는 정말로 다른 어떤 종류의 것들이 여기 있지 않습니까? 차이점을 어떻게 든 언어 디자인 수준에 반영하지 않습니까? – BreakPhreak

+0

[2]에 대한 J -_-L의 대답을 참조하십시오. –

8

당신이 브래킷을 원한다면, 당신은 할 수

by_two = lambda { |x| x * 2 } 
by_two.(5) # => 10 

.by_two(5) 사이입니다.

+0

그게 알아두면 유용합니다. – nterry