Ruby에서-> 연산자를 무엇이라고합니까?


205
  1. ->다음과 같이 운영자 에게 무엇을 호출 합니까?

    ->(...) do
      ...
    end
  2. 다음 스 니펫이 동일하지 않습니까?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}

70
Google "->"을 (를) 할 수 없다는 것이 짜증납니다-좋은 질문입니다!
Kevin

10
@Kevin 그러나 Stack Overflow의 내장 Elastic Search를 사용하여 "->"다음 을 검색 할 수 title:"->" [ruby] is:question있습니다. 열쇠는 따옴표를 사용하는 것입니다.

8
: Symbolhound 또한이 할 수있는 symbolhound.com/?q=-%3E+ruby
앤드류 그림 형제

7
성가 시거나 성 가시지 않지만 "ruby->"요청에 대한 인터넷 검색은 첫 번째 결과로이 질문에 대한 링크를 제공합니다.
fl-web

6
@Kevin 지난 2 년 동안 상황이 바뀌었을 수도 있지만 인터넷 검색 ruby "->"은이 게시물을
찾는

답변:


238

에서 언어 프로그래밍 루비 ( "방법, 프로세서 수, 람다 및 폐쇄"), 람다는 사용하여 정의 ->라고 람다 문자 .

succ = ->(x){ x+1 }
succ.call(2)

코드는 다음과 같습니다.

succ = lambda { |x| x + 1 }
succ.call(2)

비공식적으로, 나는 그것이 stabby lambda 또는 stabby literal 라고 불리는 것을 들었습니다 .


127

=>== 해시 로켓

해시 맵 리터럴에서 키와 값을 구분합니다.


->== 대시 로켓

Ruby 1.9.X (args 제외) 및 Ruby 2.X (args 포함)에서 람다 리터럴을 정의하는 데 사용됩니다. ( ->(x) { x * 2 }& lambda { |x| x * 2 }) 예제 는 실제로 동일합니다.


10
참고 우선 순위 규칙으로 인해 do/ 를 사용하는 경우 2 가지 스타일을 완전히 교환 할 수 없습니다 end. 검사 된 람다 :를 인쇄합니다 puts -> do 1 end. 이것은 블록을로 전달하여 puts람다에서 훔쳐 ArgumentError를 발생시킵니다.puts lambda do 1 end
Kelvin

1
또한 루비 1.9.3의 람다 리터럴은 인수를 허용합니다.
Kelvin

3
루비 해석하려고하기 때문에 그 것이다 @Kelvin puts lambda do 1 end로서 puts(lambda) do 1 end가 아니라 puts(lambda do 1 end). 후자는 실제로 작동합니다-루비는 대괄호가 없으면 puts메소드 대신 블록을 메소드 에 전달하려고합니다 lambda.
PJSCopeland

1
@ PJSCopeland 나는 그들이 당신이 똑같이 행동하게 할 수 없다고 말하는 것이 아닙니다. 나는 그것들이 구문 방식으로 100 % 상호 교환 가능하지 않다고 말하고 있습니다. 즉, 모든 경우에 단순히 드롭 인 대체를 할 수는 없습니다 (때로는 추가 괄호가 필요하기 때문에 lambda).
Kelvin

@rdurand "Stabby lambdas는 Ruby 1.9에서 인수를 수락 할 수 없습니다"라는 요약으로 편집 했습니까? 이것은 적어도 1.9.3의 경우 정확하지 않습니다-인수가 허용됩니다.
Kelvin


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.