经过多年的工作与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
然而,我认为这使问题变得更加复杂,而且是错误的方法。
正确的做法是什么?
1条答案
按热度按时间8ftvxx2r1#
问题是,细化是有词法作用域的。
这意味着它们仅适用于您在同一脚本中编写的代码。
如果你细化
Time#inspect
。每次从同一个文件/脚本调用Time#inspect
都将使用你改进的方法。如果你直接调用
Time.now.inspect
,你会看到。但是,细化对不在脚本中的代码没有影响。例如,
Hash#inspect
没有在代码中定义。它的定义在其他地方没有你的细化。因此,从那里调用的任何Time#inspect
都不会使用您的细化。您的选择:
Array#inspect
并适应复杂性,也要重新定义Hash#inspect
。Time#inspect
,不做任何改进,并接受副作用。