为什么变量名不能以`?`结尾而方法名称可以?

时间:2011-03-27 11:30:30

标签: ruby

方法名称可以以问号?

结尾
def has_completed?
  return count > 10
end

但变量名不能。

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

我应该如何使用它?也许总是在代码中使用hasis

if process_has_completed
  ...
end

if user_is_using_console
  ...
end

2 个答案:

答案 0 :(得分:34)

你必须要求Matz得到一个权威的答案。但是,

  • Ruby是一种无类型的编程语言,像finished?这样的变量意味着一种特定的类型(布尔值),这似乎与我相矛盾。
  • 问题有点需要接收者(谁能回答问题)。方法必须有一个接收器(调用该方法的对象),因此问号是有意义的。另一方面,变量没有接收器,它只是一个容器。

答案 1 :(得分:5)

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

所以我想认为这是设计师(Matz)提供的设计约束,以强制实施更合理,接近现实的编码方法。