Ruby 2.0中带有局部变量的插入反射代码


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中使用代码块的有用链接。

相关内容

  • 没有找到相关文章

最新更新