我正在尝试在对象中获取当前日期名称,然后我可以使用该名称执行基本计算。目前绕圈子。
我有一些这样的属性:
@location.monday_on
@location.monday_off
@location.tuesday_on
.....
我正在使用它们来确定Time.now是否在范围内:
(@location.monday_on.to_i..@location.monday_off.to_i).include? Time.now.hour
工作正常。但是,我想把事情弄干净并尝试过这个:
start = "@location.#{Time.now.strftime('%A').downcase}_on".constantize
finish = "@location.#{Time.now.strftime('%A').downcase}_off".constantize
(start.to_i..finish.to_i).include? Time.now.hour
但是,这给出了错误的常量名称的错误。抓着稻草。
在对象中获取当天名称的最佳方法是什么,以便我可以在查找中使用?
答案 0 :(得分:4)
大致是:
@location.send("#{Time.now.strftime('%A').downcase}_on".to_sym)
但是,在非常至少,该功能应该包含在@location
类中,否则主线代码会被不相关的代码混乱。
我可能已将这些函数的结果封装在散列或数组中,并传入日期名称或DoW编号。如果在DSL或其他面向用户的工件中使用它们,那么创建特定于日期的方法是很好的,否则我不相信它们的实用性。
答案 1 :(得分:0)
仅仅因为你可以使用元编程并不意味着你应该。元编程很有趣,在某些情况下可以帮助您编写更易读的代码,但是,正如您的示例所示,它可能会导致看起来很糟糕的数据驱动代码。老实说,我甚至无法确定通过查看您的代码了解您要做的事情。
一般而言,由于所有特殊情况,日期算术非常困难。即使Ruby也不完全支持它,因为它太难了。但即使Ruby对“夏令时”的无知,最好还是以Date
和DateTime
为基础,而不是试图自己动手。
通常,您不应该尝试在计算中使用日期名称。相反,使用日期数字(即工作日为0..6)并且仅在必要时使用Date::DAYNAMES[weekday]
之类的内容转换为字符串。然后你可以使用像@location.wday == DateTime.now.wday