0

是否有更简单和/或更易读的方法在 Ruby 中创建闭包,以便定义的方法可以访问变量 m

我对这里有一点“问题” lambda

我经常动态定义必须访问局部变量的方法:

例如:

class Comparison

  def income
    123
  end

  def sales
    42342
  end

  # and a dozen of other methods

  # Generate xxx_after_tax for each method
  instance_methods(false).each do |m|
    lambda {
      define_method("#{m}_after_tax") do
        send(m) * 0.9
      end
    }.call
  end
end
4

5 回答 5

5
class Comparison

  def income
    123
  end

  def sales
    42342
  end

  # and a dozen of other methods

  # Generate xxx_after_tax for each method
  instance_methods(false).each do |m|

    define_method("#{m}_after_tax") do
      send(m) * 0.9
    end

  end
end
于 2012-05-30T09:09:14.030 回答
3

常规方法定义不是闭包,但在这里您define_method使用块调用,块闭包。这应该足够了:

instance_methods(false).each do |m|
  define_method :"#{m}_after_tax" do
    send(m) * 0.9
  end
end
于 2012-05-30T09:54:40.477 回答
2

正如 Yuri 指出的那样,这lambda是多余的,您可以通过运行此示例来查看。

#!/usr/bin/env ruby -w

class Foo
  [:foo, :bar].each do |m|
    define_method("#{m}_dynamic") do
      "Called #{m}"
    end
  end
end

p Foo.new.foo_dynamic # => "Called foo"
于 2012-05-30T09:45:45.827 回答
1
  instance_methods(false).each do |m|
    class_eval <<-ERUBY, __FILE__, __LINE__
      def #{m}_after_tax
        #{m} * 0.9
      end
    ERUBY
  end
于 2012-05-30T09:06:55.593 回答
0

您可以像这样使用 method_missing :

def method_missing(name, *args, &block)
  if name.to_s.match /^([a-z_]+)_after_tax$/
    send($1)
  else
    super
  end
end

我希望这有帮助。

于 2012-05-30T09:06:58.807 回答