【发布时间】:2010-11-23 16:03:27
【问题描述】:
Ruby 中问号运算符的作用是什么?
有时它看起来像这样:
assert !product.valid?
有时它位于 if 构造中。
【问题讨论】:
-
函数末尾的问号不是运算符,是普通字符。问号和冒号是三元条件运算符。问号本身就是一元引号运算符。见stackoverflow.com/questions/16641205/…
标签: ruby
Ruby 中问号运算符的作用是什么?
有时它看起来像这样:
assert !product.valid?
有时它位于 if 构造中。
【问题讨论】:
标签: ruby
这是一种代码风格约定;它表示一个方法返回一个布尔值(真或假)或一个表示真值(或“真”值)的对象。
问号是方法名称末尾的有效字符。
https://docs.ruby-lang.org/en/2.0.0/syntax/methods_rdoc.html#label-Method+Names
【讨论】:
? 的其他几种用途(是三元运算符,将字符转换为其 ASCII 整数,在 test 中的用法,在 RegEx 等中),其中许多在其他答案中都有介绍在这里。
isEmpty()、isDigit() 等。在 Ruby 中,相同的方法将编写为 empty? 和 digit?,即IMO 好多了。
is。对于来自 Swift 的人来说,这可能会让人非常困惑,因为那里的问号用于 nullable :)
另请注意 ? 以及一个字符作为自 Ruby 1.9 以来单字符串文字的简写。
例如:
?F # => is the same as "F"
这是在string literals section of the ruby docs 底部附近引用的:
还有一个字符文字表示法来表示单个 字符串,其语法是问号 (?) 后跟 对应于单个字符的单个字符或转义序列 脚本编码中的代码点:
?a #=> "a" ?abc #=> SyntaxError ?\n #=> "\n" ?\s #=> " " ?\\ #=> "\\" ?\u{41} #=> "A" ?\C-a #=> "\x01" ?\M-a #=> "\xE1" ?\M-\C-a #=> "\x81" ?\C-\M-a #=> "\x81", same as above ?あ #=> "あ"
在 Ruby 1.9 之前,它返回字符的 ASCII 字符代码。要获得现代 Ruby 中的旧行为,您可以使用 #ord 方法:
?F.ord # => will return 70
【讨论】:
'F'
在 Ruby 中,返回布尔值的方法以问号结尾是一个惯例。没有比这更重要的了。
【讨论】:
在您的示例中,它只是方法名称的一部分。在 Ruby 中,您还可以在方法名称中使用感叹号!
Ruby 中问号的另一个例子是三元运算符。
customerName == "Fred" ? "Hello Fred" : "Who are you?"
【讨论】:
可能值得指出的是,?s 只允许在方法名称中,而不是变量中。在学习Ruby的过程中,我假设?指定了一个布尔返回类型,所以我尝试将它们添加到标志变量中,导致错误。这让我一度错误地认为有一些特殊的语法涉及?s。
相关:Why can't a variable name end with `?` while a method name can?
【讨论】:
在你的例子中
product.valid?
实际上是一个函数调用,调用了一个名为valid?的函数。按照惯例,某些类型的“条件测试”/布尔函数在函数名称中带有问号。
【讨论】:
我相信这只是布尔值的约定。有点像说“IsValid”。
【讨论】:
也用在正则表达式中,意思是“前一个字符最多重复一次”
例如,正则表达式/hey?/ 与字符串“he”和“hey”匹配。
【讨论】:
这也是与来自Kernel#test 的test 方法的第一个参数一起使用的常见约定
test ?d, "/dev" # directory exists?
# => true
test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
# => true
在这个问题中看到here
【讨论】:
test无关,?d是"d"的快捷方式。 test 将单字符字符串作为其第一个参数,因此您可以使用 test ?d, "/dev" 或 test "d", "/dev" 调用它。