【问题标题】:Ruby Method Name InterpolationRuby 方法名称插值
【发布时间】:2014-12-30 15:36:31
【问题描述】:

我试图通过迭代一个常量哈希来减少我的 Ruby 类中的代码量,以便以减少的编码量生成所有想要的方法。

这是我的代码(请随意添加其他指针,因为我是 Ruby 新手):

ENTRY_HASHES = {
    "disbursement" => {
        :description => TRANSACTION_DESCRIPTIONS[:disbursement]
    }
}

public

    ENTRY_HASHES.each do |key, value|
        def "#{value}?(amount)"
            single_entry(
              ENTRY_HASHES[:description]
              amount
            )

            @entry.save
        end
    end

我对上面的期望是这样的(对于 ENTRY_HASHES 中的每个哈希):

def disbursement?(value)
  single_entry(
     "XXXXX",
      amount
  )
end

相反,我遇到了语法错误。任何帮助将不胜感激!

【问题讨论】:

  • 你不在这里。嗯,你是对的,但并不完全正确。你需要define_method 方法来实现你的目标

标签: ruby ruby-on-rails-4 metaprogramming interpolation


【解决方案1】:

这是给你的例子:

ENTRY_HASHES = {
  "disbursement" => {
    :description => 'smth'
  }
}

ENTRY_HASHES.each do |key, value|
  define_method("#{key}?") do |argument|
    puts "#{key}? method called with #{argument}"
    puts "you can use hash values: #{value} of course"
  end
end

disbursement?('my_arg')

它会输出:

disbursement? method called with my_arg
you can use hash values: {:description=>"smth"} of course

【讨论】:

  • 在 Rails 3.1.6 控制台中,请告知,NoMethodError: undefined method `define_method' for main:Object
【解决方案2】:

这里可以看一个例子:

(class << self; self; end).instance_eval do
                define_method(key) do |message|
                  @@logger_dictionary[key].send(key,message)
                end
              end

这里我添加了一个类(类作为实例)的方法。 (添加类方法)

另外,我喜欢为类(或对象)的实例添加方法(添加实例方法)

class YourClass
 def setupMethod
  self.class.send(:define_method,key){
                        |*args|
                        @dictionary[key]
                }

                self.class.send(:define_method,key + '='){
                    |*args|
                    @dictionary[key] = args.first if args.first
                }
 end
end

也许你可以从我的回答中得到答案:)

ENTRY_HASHES.each do |key, value|
        self.class.send(:define_method, "#{value}?(amount)") {
            |*args|
            single_entry(
              ENTRY_HASHES[:description]
              amount
            )

            @entry.save
        }
    end

【讨论】:

    【解决方案3】:

    你想要的技术涉及元编程,你应该看看这个例子,取自Ruby Monk:

    class Doctor
      define_method("perform_rhinoplasty") do |argument|
            "performing rhinoplasty on #{argument}"
      end
    
      define_method("perform_checkup") do |argument|
            "performing checkup on #{argument}"
      end
    
      define_method("perform_interpretive_dance") do |argument|
        "performing interpretive dance on #{argument}"
      end
    end
    
    doctor = Doctor.new
    puts doctor.perform_rhinoplasty("nose")
    puts doctor.perform_checkup("throat")
    puts doctor.perform_interpretive_dance("in da club")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2012-01-27
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多