如何在Ruby中传递方法作为参数?

tec*_*man 2 ruby methods arguments argument-passing

我将一个方法作为参数传递给被调用的函数:

def my_function(args1)
   puts args1
end

def my_calling_method
   self.my_function(def do_this 
             return 2*3
           end)
end
Run Code Online (Sandbox Code Playgroud)

当我打电话给my_calling_method谁打电话时my_function,我得到的args1是nil而不是def do_this return 2*3 end.

我做错了吗?我们可以在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
Run Code Online (Sandbox Code Playgroud)

我使用的参考材料将Proc作为参数传递给方法,就像我一样,但我收到错误,零参数传递给my_function,因为我没有通过my_calling_method传递任何参数.

Cha*_*ell 5

定义新方法不会返回值.(就像写下电话号码不会导致谈话一样.)

irb:001>def something
irb:002>   # code here
irb:003>end
=> nil
Run Code Online (Sandbox Code Playgroud)

当你在IRB中运行时,你会得到nil,对吗?因此,如果您将该方法定义为方法调用的一部分:

some_method( def something; stuff; end )
Run Code Online (Sandbox Code Playgroud)

nil将从方法定义中返回,因此nil将被传递进去some_method.

在不确切知道你想要完成什么的情况下,我会告诉你,你可以将方法或所谓的"块"传递给你的方法调用.

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
Run Code Online (Sandbox Code Playgroud)

实际上,这是您使用该方法所做的(或多或少) .each

array.each {|ele| foo}
Run Code Online (Sandbox Code Playgroud)

我建议阅读Ruby的块,Procs和Lambdas,以便在参数中传递方法.

  • 这个电话号码是如此真实,因为我的约会生活将证明. (2认同)