首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby没有嵌套的方法,对吧?那么这是什么,有没有更好的方法?

Ruby没有嵌套的方法,对吧?那么这是什么,有没有更好的方法?
EN

Stack Overflow用户
提问于 2016-09-04 12:26:06
回答 3查看 269关注 0票数 0

我有时会使用这个结构:

代码语言:javascript
运行
复制
class Test
  def today
    date = Date.today

    def date.is_friday?
      strftime("%A") == "Friday"
    end

    date
  end
end

它工作得很好。

代码语言:javascript
运行
复制
t = Test.new
t.today # => <Date: 2016-09-03 ((2457635j,0s,0n),+0s,2299161j)>
t.today.is_friday? # => false

我一直认为这是一个嵌套的方法。但是其他人坚持认为Ruby没有嵌套的方法。好吧,我不是被名字迷住了。但是你怎么称呼它呢?有没有更好的方法来实现同样的功能?

EN

Stack Overflow用户

发布于 2016-09-04 13:58:13

在方法中调用def通常是错误的方式。您需要的是定义一个封装此方法和其他方法的模块,然后根据需要将其混合到任何对象中:

代码语言:javascript
运行
复制
module DateExtensions
  def is_friday?
    wday == 5
  end
end

值得注意的是,strftime可能会返回“星期五”以外的值,因为本地化可能会生效。根据你所在的位置,你可以得到"Freitag“或"Vendredi”。wday方法返回一个可预测的数值。

现在,您可以将以下代码混合在一起:

代码语言:javascript
运行
复制
class Test
  def today
    date = Date.today

    date.extend(DateExtensions)

    date
  end
end

通过在模块中声明这些方法,很明显它们是包的一部分。这也意味着你不需要为你创建的每个Date实例定义一个全新的方法。

一种更Ruby的方式是定义你自己的Date子类,它添加了这个额外的行为。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39313535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档