【问题标题】:Ruby time multiplication红宝石时间乘法
【发布时间】:2019-09-21 13:15:40
【问题描述】:

有人可以帮我分析一下吗?在我看来,5 分钟的平方等于 25 分钟

irb(main):014:0> now = Time.now.utc
=> 2019-05-03 01:36:41 UTC
irb(main):015:0> now + (5.minutes ** 2)
=> 2019-05-04 02:36:41 UTC

【问题讨论】:

  • 实际上,5 分钟的平方是 25 平方分钟,而不是 25 分钟。不确定 Ruby 选择如何解释它。
  • Time 是否有实例方法**
  • 只是做一些简单的算术,看起来 Ruby 正在使用秒。 5分钟是300秒。 Squared 是 90,000 秒(实际上是平方秒,但 Ruby 将其解释为秒)。那是 1500 分钟,或 1 天加 1 小时。结案。 :)
  • 秒平方(25 小时 = 5×5 60×60 秒)。哎呀,这是一个不需要存在的重载。我不确定整个 ActiveSupport::DurationActiveSupport::Duration::Scalar 是如何工作的,如果它是继承 Numeric 或其他东西的副作用。
  • 你能解释一下为什么你认为(5min)^2应该等于25min吗?那不是正确的数学。正确的结果是25min^2。但是在这种情况下,min^2 是什么意思?

标签: ruby-on-rails ruby time activesupport


【解决方案1】:
  1. 在 ruby​​ 中没有 Numeric#minutes,那是 Rails 的猴子补丁。
  2. Numeric#minutes 被委派给 ActiveSupport::Duration#minutes,后者又构造了一个 ActiveSupport::Duratioon::Scalar 实例,以秒数作为“后面的数字”。该号码将用于:
  3. coercion 可能用于涉及 Numeric 等的任何算术。

也就是说,当 foo.minutes 遇到以 Numeric 作为 RHO 的算术运算时,它 [使用强制] 使用秒数进行数学运算。

更重要的是,与Numeric 的比较也可以:

5.minutes == 300
#⇒ true

因此我的建议是:永远不要使用这些带有误导性的猴子补丁。明确使用秒来执行日期/时间操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多