Ruby中问号运算符的用途是什么?
有时看起来像这样:
assert !product.valid?
有时它位于if
构造中。
答案 0 :(得分:265)
这是一种代码风格的约定;它表示方法返回一个布尔值。
问号是方法名称末尾的有效字符。
答案 1 :(得分:75)
另请注意?
以及字符,将返回A
例如:
?F # => will return 70
或者在红宝石1.8中你可以这样做:
"F"[0]
或红宝石1.9:
"F".ord
另请注意?F
将返回字符串"F"
,因此为了缩短代码,您还可以在Ruby 1.9中使用?F.ord
来获得与{"F".ord
相同的结果1}}。
答案 2 :(得分:38)
Ruby中的一个约定是返回布尔值的方法以问号结尾。没有比这更重要的了。
答案 3 :(得分:24)
在您的示例中,它只是方法名称的一部分。在Ruby中,您还可以在方法名称中使用感叹号!
Ruby中问号的另一个例子是三元运算符。
customerName == "Fred" ? "Hello Fred" : "Who are you?"
答案 4 :(得分:15)
在你的例子中
product.valid?
实际上是一个函数调用并调用一个名为valid?
的函数。某些类型的“条件测试”/布尔函数按惯例将问号作为函数名称的一部分。
答案 5 :(得分:12)
值得指出的是,只允许使用方法名称而不是变量。在学习Ruby的过程中,我假设了?指定一个布尔返回类型,所以我尝试将它们添加到标志变量,导致错误。这导致我错误地相信有一些特殊的语法涉及?s。
相关:Why can't a variable name end with `?` while a method name can?
答案 6 :(得分:6)
我相信这只是布尔事物的约定。有点像说“IsValid
”。
答案 7 :(得分:1)
它也用在正则表达式中,意思是“最多只重复一次前面的字符”
例如,正则表达式/hey?/
与字符串“he
”和“hey
”匹配。
答案 8 :(得分:0)
使用test
中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
如此问题here
中所示