问号运算符在Ruby中是什么意思?


211

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

有时看起来像这样:

assert !product.valid?

有时它在if构造中。


2
函数末尾的问号不是运算符,而是普通字符。问号和冒号是三元条件运算符。问号本身就是一元引号运算符。见stackoverflow.com/questions/16641205/...
老临

Answers:


296

这是一种代码样式约定;它表示一个方法返回一个布尔值。

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


9
谢谢,但是此约定是否表示逻辑,否则可能会有副作用?有趣的是,这是如何围绕代码中带有返回类型的类型化语言进行的破解。
杰森

5
在这种情况下,严格来说,这是一种方法命名约定。没有强制执行布尔返回值。仅仅因为方法名称以问号结尾并不意味着该方法必须返回一个布尔值...但是它绝对应该返回一个布尔值。但是?,Ruby 中还有其他的用途(是三元运算符,将字符转换为ASCII整数test,在RegEx中使用in ,等等),其中许多在其他答案中都有介绍。
Karl Wilbur 2015年

4
@Jason FYI,甚至强类型语言也有这样的约定。例如,在Java方法返回一个布尔值往往与前缀“是”,如isEmpty()isDigit()等在Ruby中,同样的方法将被写入empty?,而digit?这是相当多的更好IMO。
Ajedi32

3
Ajedi32-是的,我同意这样命名函数很好,我is一直都在使用。对于来自Swift的人来说,这可能会非常令人困惑,因为那里的问号用于nullable:)
Jason

83

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

例如:

?F # => will return 70

或者在ruby 1.8中,您可以执行以下操作:

"F"[0]

或在ruby 1.9中:

"F".ord

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


29
在ruby 1.9中它将返回'F'
klew 2010年

39

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


28

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

Ruby中问号的另一个示例是三元运算符。

customerName == "Fred" ? "Hello Fred" : "Who are you?"

13
要扩展Andy的答案,您还将看到类似以下内容:customerName == user.logged_in??user.name:“你是谁?” 请注意双重问号
问号

16

在你的例子中

product.valid?

实际上是一个函数调用,并且调用了一个名为的函数valid?。某些类型的“条件测试” /布尔函数在约定中具有问号作为函数名称的一部分。


41
answer.gsub!(/ function /,'method')
格伦·杰克曼(



2

它也用在正则表达式中,意思是“最多重复一个前一个字符”

例如,正则表达式/hey?/ 与字符串“ he”和“ hey” 匹配。


0

与来自Kernel#test测试方法的第一个参数一起使用也是一种通用约定

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

这里的问题所示


3
与无关test?d是的快捷方式"d"test将一个字符的字符串作为第一个参数,因此可以使用test ?d, "/dev"或调用它test "d", "/dev"
bfontaine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.