class Test
def method
a = 2
b = 3
yield
c = 4
a *= c
a
end
def method_x
method {}
end
def method_y
method { a += b }
end
end
test = Test.new
p test.method_x
p test.method_y
上面的代码工作不好。
$ ruby code.rb
8
code.rb:16:in `block in method_y': undefined local variable or method `b' for #<Test:0x007fe6da094890> (NameError)
from code.rb:5:in `method'
from code.rb:16:in `method_y'
from code.rb:22:in `<main>'
我原以为test.method_y会返回20。我想在一个特定的过程中插入反射代码。但我不知道在反射代码中的目标代码块上使用局部变量。你能告诉我如何使用局部变量或一个好的设计吗?
块没有访问方法变量的权限。您需要将这些变量传递到块中。
class Test
def method
a = 2
b = 3
a = yield(a,b) || a
c = 4
a *= c
a
end
def method_x
method {}
end
def method_y
method { |x, y| x += y }
end
end
test = Test.new
p test.method_x
p test.method_y
由于块可能返回nil,因此上面的代码仅在块不为nil的情况下将块的结果移动到a
中,否则保持a
不变。
编辑
也有可能您没有将块传递到方法中。。。该块可以是可选的。
在这种情况下,你可能想做…
(a = yield(a,b) || a) if block_given?
以下是在ruby代码块中传递变量的方法:
class Test
def method
a = 2
b = 3
a = block_given? ? a : yield(a, b)
c = 4
a *= c
a
end
def method_x
method {}
end
def method_y
method {|a,b| a += b }
end
end
test = Test.new
p test.method_x
p test.method_y
代码的问题是它不会修改本地变量,并且在代码块中传递变量时使用了错误的语法。这里有一个关于如何在ruby中使用代码块的有用链接。