我想写一个满足的代码:
SomeClass.new.execute(method) == 3
我有:
class SomeClass
def execute(method)
def method
yield
end
end
end
method = 1+2
给了我nil
。我对收益率仍然非常困惑。非常感谢任何帮助。
答案 0 :(得分:5)
您沿着正确的方向行,但您的参数method
必须是代码块。
您可以通过几种不同的方式创建代码块。最常见的是使用{...}
或do...end
进行匿名处理。如果您想将代码块存储在变量中,而您需要执行此变量来调用SomeClass.new.execute(method)
,则可以使用Proc.new
。
还有其他创建块的方法(使用lambda
语法),但它们超出了这个问题的范围。
这将使用存储在变量中的块:
class SomeClass
def execute
yield
end
end
method = Proc.new { 1+2 }
SomeClass.new.execute(&method) # => 3
或者,更简洁,
SomeClass.new.execute { 1 + 2 } # => 3
答案 1 :(得分:4)
你是一个正确的方向 - 是的。 yield
将执行传入的块。所以你想做这样的事情:
class SomeClass
def execute
yield
end
end
然后你可以这样称呼它:
SomeClass.new.execute { 1+2 }
答案 2 :(得分:4)
yield
关键字将控制权传递给传递给该方法的任何块。你没有通过任何街区,所以无事可做。
你想要这样的东西:
class C
def execute
yield # Pass control to a block that was passed in.
# Method returns whatever the value of evaluating `b` was.
end
end
现在你可以做到:
C.new.execute { 1 + 2 } # Pass block containing a statement "1 + 2".
# => 3 # The result of evaluating "1 + 2" is
# returned from the #execute method.
如果要传递与要传递的块相对应的方法对象,而不是匿名指定它,可以创建 lambda :
b = lambda { 1 + 2 }
C.new.execute &b # Pass an object to #execute that will be used as
# => 3 # the block.
Ruby有一些大致相同的制作lambdas的方法:
lambda { 1 + 2 }
Proc.new { 1 + 2 }
-> { 1 + 2 }