Luc*_*ain 2 ruby variables block proc
我正在尝试学习块和触发器,我觉得这应该是可行的,但到目前为止我还没有成功.
我想要的是什么:
def main_action(generic_variable, block)
generic_variable += 1 # I do more interesting stuff than this in my version
yield(generic_variable)
end
main_action(3, {|num| num + 5 })
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
我找到的最接近的是http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html,似乎需要创建一个传递方法来发送块:
class Monkey
# Monkey.tell_ape { "ook!" }
# ape: ook!
# => nil
def self.tell_ape(&block)
tell("ape", &block)
end
def self.tell(name, &block)
puts "#{name}: #{block.call}"
end
end
Run Code Online (Sandbox Code Playgroud)
如果我使用在我的代码中设置的相同传递方法,我可以使它工作,但它似乎是不必要的代码.我试着Monkey.tell("ape", { "ook!" })直接打电话,但得到了syntax error, unexpected '}', expecting tASSOC
是否有可能在一次调用中向一个函数发送一个变量和一个块(或proc,我不挑剔)?另外,如果你有时间,上面发生了什么?为什么不起作用?
你似乎混淆了块和触发器.块不是ruby对象.你无法通过它
foo(args, block)
Run Code Online (Sandbox Code Playgroud)
传递它的唯一方法是foo(args){...}或foo(args) do ... end.但是,在方法定义中,您可以接收一个块,将其转换为proc,并将其作为其参数之一接受,如下所示:
def foo(args, &block)
...
end
Run Code Online (Sandbox Code Playgroud)
另一方面,您可以将proc对象作为参数传递
foo(args, proc)
Run Code Online (Sandbox Code Playgroud)
创建proc对象有几种方法,并且靠近块文字的文字是lambda : ->{...},但它与块语法不同{...}.使用它,你可以做到
foo(args, ->{...})
Run Code Online (Sandbox Code Playgroud)
但不是
foo(args, {...})
Run Code Online (Sandbox Code Playgroud)
除非{...}是哈希.