Ruby 将进程分配给常量

Ruby 将进程分配给常量,ruby,lambda,constants,proc,Ruby,Lambda,Constants,Proc,我发现procs和lambdas可以作为short方法和helper模块的替代品。我将不属于其他任何地方的方法放入一个文件中,该文件只是一个分配给常量的过程列表。例如,init.rb需要一个文件helper\u procs.rb,该文件包含以下内容: RED_TEXT = proc{|t| "\e[31m#{t}\e[0m"} GREEN_TEXT = proc{|t| "\e[32m#{t}\e[0m"} YELLOW_TEXT = proc{|t| "\e[33m#{t}\e[0m"}

我发现procs和lambdas可以作为short方法和helper模块的替代品。我将不属于其他任何地方的方法放入一个文件中,该文件只是一个分配给常量的过程列表。例如,
init.rb
需要一个文件
helper\u procs.rb
,该文件包含以下内容:

RED_TEXT = proc{|t| "\e[31m#{t}\e[0m"} 
GREEN_TEXT = proc{|t| "\e[32m#{t}\e[0m"}
YELLOW_TEXT = proc{|t| "\e[33m#{t}\e[0m"}

CURRENT_TIME = proc do
  date = Time.now.to_s.split(' ')[0].split('-').reverse.join('-')
  time = Time.now.to_s.split(' ')[1]; "#{time} (#{date})"
end
然后,在程序中的任何位置(在不同的文件中),我执行以下操作:


这是坏习惯吗?有陷阱吗?

这是一种不好的做法。在主级别定义常量和使用全局变量一样糟糕。这违背了面向对象编程(OOP)的目的。在OOP中,您希望尽可能多地隐藏不必要的东西。如果某个东西总是对字符串起作用,那么在字符串的上下文之外就不应该访问它,而应该在
string
类中定义它。如果某个东西总是提供某种形式的时间,那么它应该在
time
类中定义,根据方法的性质,可以定义为类或实例方法。

在一个完美的世界中,我同意你的观点,monkeypatching也不好,这就是你的建议。此外,顶级常量没有全局变量那么糟糕。另外,作为一个Ruby挑剔的例子,您在其中放置常量的顶级模块都是常量。哈)Ruby鼓励猴子打补丁。如果这是一个问题,那就是改进的目的。常数,我指的是模块以外的常数,我知道。我在挑剔。不过,更严肃的是,在改进之前,monkeypatching在库和大型代码库中是不受欢迎的,因为Rails是应用程序的全新环境。对于那些实际上必须与其他库一起工作或者没有其他人使用它来处理其内容的小型库来说,不使用monkeypatching可能是相当重要的。因此本质上我应该做一些事情,比如类字符串def red_text,然后“\e[31m{self}\e[0m”?
puts GREEN_TEXT["A string!"]
puts CURRENT_TIME.call