ruby 使用method_missing扩展Fixnum以更自然的方式处理某些时间约定。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 使用method_missing扩展Fixnum以更自然的方式处理某些时间约定。相关的知识,希望对你有一定的参考价值。

# This combines the examples given here http://pastebin.com/zxsur5MX
# and here http://pastebin.com/agjb5qBF

#  Note: Time.now returns current time as seconds since epoch
module TimeConventions
  TIME_CONVENTIONS = {
    'second'   => 1,
    'minute'   => 60,
    'hour'     => 60 * 60,
  }

  def method_missing(method_id, *args, &block)
    singular_convention = method_id.to_s.gsub(/s$/, '')
    if TIME_CONVENTIONS.has_key? singular_convention
      self * TIME_CONVENTIONS[singular_convention]
    else
      super
    end
  end

  def ago      ; Time.now - self ; end
  def from_now ; Time.now + self ; end
end

class Fixnum
  include TimeConventions
end

puts Time.now
# => Mon Nov 07 10:18:10 -0800 2011
puts 1.minute.ago
# => Mon Nov 07 10:17:10 -0800 2011
puts 5.minutes - 4.minutes
# => 60
puts 1.hour.from_now
# => Mon Nov 07 11:18:15 -0800 2011
puts 3.hours.from_now
# => Mon Nov 07 13:18:15 -0800 2011

以上是关于ruby 使用method_missing扩展Fixnum以更自然的方式处理某些时间约定。的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的 method_missing 陷阱

ruby 使用define_method和method_missing

Ruby BasicObject方法

Ruby BasicObject 方法

Ruby:define_method 与 def

dynamic_matchers.rb:55:in `method_missing':ActiveRecord::Base:Class 的未定义方法 `migration_error=' (NoMet