我有时会使用这个结构:
class Test
def today
date = Date.today
def date.is_friday?
strftime("%A") == "Friday"
end
date
end
end它工作得很好。
t = Test.new
t.today # => <Date: 2016-09-03 ((2457635j,0s,0n),+0s,2299161j)>
t.today.is_friday? # => false我一直认为这是一个嵌套的方法。但是其他人坚持认为Ruby没有嵌套的方法。好吧,我不是被名字迷住了。但是你怎么称呼它呢?有没有更好的方法来实现同样的功能?
发布于 2016-09-04 13:58:13
在方法中调用def通常是错误的方式。您需要的是定义一个封装此方法和其他方法的模块,然后根据需要将其混合到任何对象中:
module DateExtensions
def is_friday?
wday == 5
end
end值得注意的是,strftime可能会返回“星期五”以外的值,因为本地化可能会生效。根据你所在的位置,你可以得到"Freitag“或"Vendredi”。wday方法返回一个可预测的数值。
现在,您可以将以下代码混合在一起:
class Test
def today
date = Date.today
date.extend(DateExtensions)
date
end
end通过在模块中声明这些方法,很明显它们是包的一部分。这也意味着你不需要为你创建的每个Date实例定义一个全新的方法。
一种更Ruby的方式是定义你自己的Date子类,它添加了这个额外的行为。
https://stackoverflow.com/questions/39313535
复制相似问题