ruby-on-rails – 30.seconds.ago如何实现?

我发现了这个问题 here.

并且真的很想知道在Rails中实现类似30.seconds.ago的技术解释.

方法链?数字使用情况如下:
http://api.rubyonrails.org/classes/Numeric.html#method-i-seconds

还有什么?

解决方法

Here是秒的执行:
def seconds
    ActiveSupport::Duration.new(self,[[:seconds,self]])
  end

并且,here是以前的实施:

# Calculates a new Time or Date that is as far in the past
# as this Duration represents.
def ago(time = ::Time.current)
  sum(-1,time)
end

并且,here是在以前使用的sum方法的实现:

def sum(sign,time = ::Time.current) #:nodoc:
    parts.inject(time) do |t,(type,number)|
      if t.acts_like?(:time) || t.acts_like?(:date)
        if type == :seconds
          t.since(sign * number)
        else
          t.advance(type => sign * number)
        end
      else
        raise ::ArgumentError,"expected a time or date,got #{time.inspect}"
      end
    end
  end

要完全理解它,您应该按照方法调用并在Rails源代码中查找它们的实现,就像我刚才给您看到的那样.

在Rails代码库中查找方法定义的一种简单方法是在Rails控制台中使用source_location:

> 30.method(:seconds).source_location
# => ["/Users/rislam/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/time.rb",19]
> 30.seconds.method(:ago).source_location
# => ["/Users/rislam/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/duration.rb",108]

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...