ruby 使用define_method和method_missing

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 使用define_method和method_missing相关的知识,希望对你有一定的参考价值。

# Using define_method

%w(published unpublished draft).each do |possible_status|
  define_method("#{possible_status}") do
    possible_status
  end
end

# Using method_missing

class CarModel
 def method_missing(name, *args)
  name = name.to_s

  super unless name =~ /(_info|_price)=?$/

  name =~ /=$/ ? instance_variable_set("@#{name.chop}", args.first) : instance_variable_get("@#{name}")
 end
end

@car_model = CarModel.new

@car_model.stereo_info    = "CD/MP3 Player"
@car_model.stereo_price   = "£79.99"

@car_model.stereo_info  # => "CD/MP3 Player"
@car_model.stereo_price # => "£79.99"


# =~ is used to compare a string to a regex pattern

# We invoke super for methods that don't end in _info or _price. Invoking super
# call method_missing of the parent class which eventually raises NoMethodError

以上是关于ruby 使用define_method和method_missing的主要内容,如果未能解决你的问题,请参考以下文章

ruby define_methodメソッドでコードをシンプルに书く

在 Ruby 中动态定义命名类

Object Ruby 中的模块方法

带参数的 Ruby DSL 定义方法

你如何将参数传递给define_method?

使用defineu方法定义实例和类方法