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

nop*_*ole 54 ruby

方法名称可以以问号结尾 ?

def has_completed?
  return count > 10
end
Run Code Online (Sandbox Code Playgroud)

但变量名不能.

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

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

if process_has_completed
  ...
end

if user_is_using_console
  ...
end
Run Code Online (Sandbox Code Playgroud)

svo*_*oop 35

你必须要求Matz得到一个权威的答案.然而,

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

  • 那么这不适用于方法和变量名称吗?另外,我认为暗示没有错,例如,如果我们不使用`?`,我们可能会使用其他东西......并且暗示也是如此.使用`?`只是一个方便的符号. (16认同)
  • 你的语义理论的另一个论点是带有感叹号的方法.使用`?`和`!`的方法可以看作是给对象的问题和顺序.这对变量没有影响. (5认同)
  • 我并不真的购买这种推理,或者至少它在Ruby中是有意义的,因为它存在于今天.仅仅因为Ruby是无类型的并不意味着名称不应该暗示类型.几乎总是相反的.如果一个变量被称为`full_name`,它几乎肯定不会是一个浮点数.相比之下,在类型化编程中,实际上有时名称_should not_暗示一种类型 - 在使用泛型时.接收器的东西也没有用,因为通常的做法是使用getter和setter来处理方法,就好像它们是作用域或块中的变量一样. (3认同)

小智 5

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

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