2013-08-08 3 views
2

은 내가 호출 된 함수에 인수 등의 방법을 전달하고있다 : Ruby에서 메소드를 인수로 전달할 수 있습니까?

def my_function(args1) 
    puts args1 
end 

def my_calling_method 
    self.my_function(def do_this 
      return 2*3 
      end) 
end 

내가 my_function에 호출을 my_calling_method 전화

, 내가 대신 def do_this return 2*3 end의 전무로 args1을 얻고있다.

뭐가 잘못 되었나요? Ruby에서 메소드를 인수로 전달할 수 있습니까?

좋아요, 지금은 내 요구 사항에 대한 Proc 구현했지만 노력하고있어 호출 메서드에 전달하는 데 어려움을 겪고 있습니다.

my_Proc = Proc.new do 
    return 2*3 
end 

def my_calling_method 
    self.my_function 
end 

def my_function my_Proc 
    my_Proc.call 
end 

내가 사용하는 참고 자료는 내가 같은 방법으로 인수로 PROC을 통과,하지만 난 오류, 내가 my_calling_method을 통해 어떤 인수를 전달하고 있지 않다으로 my_function에 전달 제로 인수를 얻고있다.

+2

블록을 메소드로 전달합니다 (Procs 및 Lambdas를 살펴보십시오). 나는 그것이 당신이 찾고있는 것이라고 생각합니다. –

+0

@CharlesCaldwell 정확히 말하면 .. .. –

+0

무엇을 성취하려고합니까? "def do_this return 2 * 3 end"문자열을 얻을 것으로 예상하는 것처럼 보입니다. 메소드를 전달할 수 있는지, 그냥 할 수 있는지 여부를 디버깅하기 위해'puts '를 사용 하는지를 확인하려고합니까? –

답변

4

새 메소드를 정의하면 값이 반환되지 않습니다. (많은 전화 번호를 적어처럼 대화 발생하지 않습니다.)

irb:001>def something 
irb:002> # code here 
irb:003>end 
=> nil 

당신이 IRB에, 당신은 nil 얻을 실행하면, 맞죠? 당신은 다시 nil 방법 정의에서 따라서 점점

some_method(def something; stuff; end) 

some_method로 전달되는 것을 nil이 : 그래서, 당신은 방법은 메소드 호출의 일부로서 그을 정의 합니다.

정확히 무엇을 달성하려고하는지 알지 못하면 메서드 호출이나 메서드 블록 호출을 메서드 호출에 전달할 수 있습니다. 사실

def my_function(&block) 
    puts block.call 
end 

my_function {2*3} 
#=> 6 
my_function {t = Time.now; t + 8640} 
#=> 2013-08-09 14:03:29 -0500 
my_function do 
    name = "Charlie" 
    name.downcase.reverse.capitalize 
end 
#=> Eilrahc 

, 이것은 당신이 방법에 (더 이하)하고있는 것입니다 내가 인수로 방법을 전달하는 루비의 블록, 프로세서 수 및 람다에 최대 읽어 보시기 바랍니다 .each

array.each {|ele| foo} 

.

+2

그 전화 번호는 사실입니다. 데이트하는 생명이 증명할 것입니다. –

+0

당신이 그것을 나눠 줄 때 전화 번호 주위에'{}'을 두는 것이 당신을 '도와 줄 것입니다.' ;) –

+0

Proc로 질문을 업데이트했습니다. 하지만 내 방법은 Proc를 참조 할 수 없습니다. 내가 여기서 뭔가를 놓치고 있니? –

0

아무 잘못 없습니다. 메서드 정의는 nil을 반환합니다. def do_this; return 2*3 end의 값은 nil입니다. 그것이 당신이 얻는 것입니다.

+0

args1 = def do_this는 2 * 3을 반환하지 않아야합니까? –

+0

예. 그리고 그것은 '전혀'아니다. – sawa

+0

@tech_learning ** 메소드를 ** 정의하면'nil'이됩니다. ** ** 메소드를 호출하면 반환 값을 얻습니다. –