2012-12-19 4 views
36

가능한 중복 기능을 전달하는 방법 :이 일을 알고
Shorter way to pass every element of an array to a function블록 대신

:

def inc(a) 
    a+1 
end 
[1,2,3].map{|a| inc a} 

하지만 파이썬에서

, 난 그냥 필요를 쓰기 :

map(inc, [1,2,3]) 

또는

[inc(x) for x in [1,2,3]) 

은 내가 루비에서 블록을 만드는 단계를 건너 뛸 수 있는지 궁금하고 이런 짓을했다 :

[1,2,3].map inc 
# => ArgumentError: wrong number of arguments (0 for 1) 
# from (irb):19:in `inc' 

사람이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

+0

이 http://stackoverflow.com/questions/13834846/shorter-way-to-pass- 모든 요소를 ​​배열로 변환하는 기능/13834860 ​​# 13834860 ​​ – oldergod

답변

57

는 "Passing Methods like Blocks in Ruby"에 따르면, 당신과 같이 블록 등의 방법을 전달할 수 있습니다 그 자신의 블록을 압연보다 훨씬 더 있다면

p [1,2,3].map(&method(:inc)) 

솔직히 모르겠어요. 당신의 방법을 사용하고있는 객체의 클래스에 정의되어있는 경우

, 당신이 할 수 있습니다 :

이 경우
# Adding inc to the Integer class in order to relate to the original post. 
class Integer 
    def inc 
    self + 1 
    end 
end 

p [1,2,3].map(&:inc) 

, 루비는 인스턴스 메서드의 이름과 기호를 해석하고 전화를 시도합니다 그 객체에 대한 메소드.


이유는 파이썬에서 일류 개체로 함수 이름을 전달하지만, 루비 괄호없이 제로 인수 메소드를 호출 할 수 있기 때문에하지 루비에서, 할 수 있습니다. 파이썬의 문법은 괄호가 필요하기 때문에 함수 이름을 전달하고 인수가없는 함수를 호출하는 것 사이의 모호성을 방지합니다.

+0

Ruby는 더 순수한 OO 언어 인'map (: inc)'을 직접 작성할 수 없다는 또 다른 이유가 있다고 생각합니다. – halfelf

+0

Ack, '&'토큰을 잊어 버렸습니다. 죄송합니다. 결정된. –

+3

'Ruby는 심볼을 인스턴스 메소드 이름으로 해석하고 해당 객체에서 메소드를 호출하려고합니다.'=> 인스턴스 메소드에 대한 언급이 정확하지 않거나 적어도 명확하지 않습니다. '&'는 Proc 인 경우 첨부 된 내용을 블록으로 변환합니다. 이것이 Proc가 아니면,'to_proc'을 적용합니다 (이 경우'Symbol # to_proc'). – sawa

-8
def inc(a) 
    a + 1 
end 

p [1,2,3].map{|a| inc a} 
9

가 귀하의 질문에 대답하지 않습니다하지만 당신은 정말 모든 변수를 증가하려는 경우, 당신은 Integer#next

4.next 
#=> 5 

[1,2,3].map(&:next) 
#=> [2, 3, 4]