【问题标题】:Why can't a variable name end with `?` while a method name can?为什么变量名不能以 `?` 结尾,而方法名可以?
【发布时间】:2011-03-27 11:30:30
【问题描述】:

方法名可以以问号?结尾

def has_completed?
  return count > 10
end

但变量名不能。

这是什么原因?变量名也以同样的方式结尾不是很方便吗?鉴于我们通常无法仅通过查看名称 foobar 来判断 foobar 是方法还是变量,为什么 ? 的情况除外?

我应该如何处理这个?也许总是在代码中使用hasis

if process_has_completed
  ...
end

if user_is_using_console
  ...
end

【问题讨论】:

  • 附注:按照惯例,has_is_ 这样的前缀在 Ruby 中并不流行,因此 def completed? 会是一个更好的例子。

标签: ruby


【解决方案1】:

您必须询问 Matz 以获得权​​威的答案。不过,

  • Ruby 是一种无类型的编程语言,像 finished? 这样的变量会暗示一种特定的类型(布尔值),这在我看来有点矛盾。
  • 一个问题在某种程度上需要一个接收者(谁可以回答这个问题)。一个方法必须有一个接收者(调用该方法的对象),所以问号是有意义的。另一方面,变量没有接收者,它只是一个容器。

【讨论】:

  • 那么这不适用于方法名和变量名吗?另外,我认为暗示没有错,例如,如果我们不使用?,我们可能会使用其他东西......并且暗示也是如此。拥有? 只是一个方便使用的符号。
  • 有一个区别,因为一个变量保存一个特定的值,而一个方法可以返回不同类型的值。但是,从语义的角度来看:方法是发送给对象的消息,因此您可以告诉对象做某事或向它询问值(因此是问号)。变量只是持有一个特定的值。
  • 您的语义理论的另一个论据是带有感叹号的方法。带有?! 的方法可以看作是对对象的问题和命令。这对变量没有意义。
  • “你必须让 Matz 得到一个权威的答案。”除非有人已经在某个 Ruby 邮件列表中询问过......
  • 我并不真正相信这种推理,或者至少它在当今存在的 Ruby 中是有意义的。仅仅因为 Ruby 没有类型并不意味着名称不应该暗示类型。几乎总是相反。如果一个变量被称为full_name,它几乎肯定不会是一个浮点数。相比之下,在类型化编程中,实际上有时名称不应该暗示类型——在使用泛型时。接收者的事情也站不住脚,因为通常的做法是使用 getter 和 setter 来处理方法,就好像它们是范围或块内的变量一样。
【解决方案2】:

现在这只是一个想法,但我认为名称如empty? 的方法表明必须在对象或类内部进行某种检查(取决于上下文)。这种检查或评估意味着必须采取行动。总体而言,由于我们向(因此,?)对象询问某些状态,这意味着对象的状态可能会在整个应用程序的生命周期中发生变化。变量可能已过时,但?-method(检查)将在特定时刻完成,从而提供有关可以以布尔形式呈现的某些状态的最新信息。

所以我想这是架构师 (Matz) 提供的设计约束,用于执行更合乎逻辑、更接近现实生活的编码方法。

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2014-03-09
    • 2010-09-25
    • 2022-08-19
    • 1970-01-01
    • 2012-02-28
    • 2018-07-07
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多