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 に答える