ruby 如何使用细化来更改{ now}的输出:Time.now}.检查是否要定制?

u1ehiz5o  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(121)

经过多年的工作与Ruby,我终于遇到了一个很好的需要Ruby细化!

# frozen_string_literal: true

module TimeMongoInspect
  refine Time do

    def inspect
      strftime("Time.parse('%Y-%m-%d %H:%M:%S %z')")
    end

    def to_s
      strftime("Time.parse('%Y-%m-%d %H:%M:%S %z')")
    end
  end
end

using TimeMongoInspect

a = { time: Time.now }
puts a.inspect

所需输出为

{:time=>Time.parse('2023-08-29 00:39:08.546338569 +0000')}

如果有人好奇,我希望能够剪切n粘贴输出到代码中,但是,我需要的日期是正确的interpeted作为一个真实的时间类。
ChatGPT表示还可以优化Array和Hash

module TimeMongoInspect
  refine Time do
    def inspect
      "Time.parse('#{strftime('%Y-%m-%d %H:%M:%S %z')}')"
    end

    def to_s
      inspect
    end
  end
  
  refine Hash do
    def inspect
      "{" + self.map { |k, v| "#{k.inspect}: #{v.inspect}" }.join(", ") + "}"
    end
  end

  refine Array do
    def inspect
      "[" + self.map { |v| v.inspect }.join(", ") + "]"
    end
  end
end

然而,我认为这使问题变得更加复杂,而且是错误的方法。
正确的做法是什么?

8ftvxx2r

8ftvxx2r1#

问题是,细化是有词法作用域的。
这意味着它们仅适用于您在同一脚本中编写的代码。
如果你细化Time#inspect。每次从同一个文件/脚本调用Time#inspect都将使用你改进的方法。
如果你直接调用Time.now.inspect,你会看到。
但是,细化对不在脚本中的代码没有影响。例如,Hash#inspect没有在代码中定义。它的定义在其他地方没有你的细化。因此,从那里调用的任何Time#inspect都不会使用您的细化。
您的选择:

  • 如果你想在你的改进中使用Array#inspect并适应复杂性,也要重新定义Hash#inspect
  • 在全局范围内重新定义Time#inspect,不做任何改进,并接受副作用。

相关问题