问号运算符在Ruby中意味着什么?

rta*_*oni 196 ruby

Ruby中问号运算符的目的是什么?

有时它看起来像这样:

assert !product.valid?
Run Code Online (Sandbox Code Playgroud)

有时它在一个if结构中.

chi*_*tom 275

这是一种代码风格的约定; 它表示方法返回一个布尔值.

问号是方法名称末尾的有效字符.

  • 谢谢,但是这个惯例是否意味着它只有_logic还是会有副作用?有趣的是,这是一种类似于代码中返回类型的类型语言的黑客攻击. (9认同)
  • 在这种情况下,它严格地是一种方法命名约定.没有强制执行布尔返回值.仅仅因为方法名称以问号结尾并不意味着方法*必须*返回一个布尔值...但它绝对*应该*返回一个布尔值.然而,Ruby中的`?`还有其他一些用法(是一个三元运算符,将字符转换为ASCII整数,在`test`中使用,在RegEx'中等),其中很多都包含在其他答案中这里. (5认同)
  • @Jason FYI,即使是强类型语言也有这样的约定.例如,在Java中,返回布尔值的方法通常以"is"为前缀,如`isEmpty()`,`isDigit()`等.在Ruby中,相同的方法会写成`empty?`,并且`digit?`这是一个相当好的IMO. (4认同)
  • Ajedi32 - 是的我同意命名这样的函数很好,我总是使用`is`.对于来自Swift的人来说,这可能会让人感到非常困惑,因为那里的问号用于"可空"::) (2认同)

小智 79

还要注意?一个字符,将返回ASCII字符代码A

例如:

?F # => will return 70
Run Code Online (Sandbox Code Playgroud)

或者在ruby 1.8中你可以这样做:

"F"[0]
Run Code Online (Sandbox Code Playgroud)

或者在红宝石1.9中:

"F".ord
Run Code Online (Sandbox Code Playgroud)

另请注意,?F将返回字符串"F",因此为了使代码更短,您还可以?F.ord在Ruby 1.9中使用以获得相同的结果"F".ord.

  • 在ruby 1.9中它会返回''F' (27认同)

Eif*_*ion 38

Ruby中的一个约定是返回布尔值的方法以问号结尾.没有比这更重要的了.


And*_*ell 25

在您的示例中,它只是方法名称的一部分.在Ruby中,您还可以在方法名称中使用感叹号!

Ruby中问号的另一个例子是三元运算符.

customerName == "Fred" ? "Hello Fred" : "Who are you?"
Run Code Online (Sandbox Code Playgroud)

  • 要扩展Andy的答案,您还会看到以下内容:customerName == user.logged_in??user.name:"你是谁?" 请注意双问号 (12认同)

Tim*_*sch 15

在你的例子中

product.valid?
Run Code Online (Sandbox Code Playgroud)

实际上是一个函数调用并调用一个名为的函数valid?.某些类型的"条件测试"/布尔函数按惯例将问号作为函数名称的一部分.

  • answer.gsub!(/ function /,'method') (41认同)

Ric*_*ith 13

值得指出的是,只允许在方法名称中使用?s,而不是变量.在学习Ruby的过程中,我假设了?指定一个布尔返回类型,所以我尝试将它们添加到标志变量,导致错误.这导致我错误地相信有一些特殊的语法涉及?s.

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


Nei*_*ell 6

我相信这只是布尔事物的约定.有点像说" IsValid".