在Ruby中,方法名后面的问号是什么意思?

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

有时它是这样的:

assert !product.valid?

有时它在if构造中。

129745 次浏览

这是一种代码风格的约定;它指示一个方法返回一个布尔值(真或假)或一个对象来指示一个真值(或“真”值)。

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

https://docs.ruby-lang.org/en/2.0.0/syntax/methods_rdoc.html#label-Method+Names

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

我相信这只是布尔值的一种惯例。有点像说“IsValid”。

在你的例子中

product.valid?

实际上是一个函数调用,调用名为valid?的函数。根据约定,某些类型的“test for condition”/布尔函数在函数名中有一个问号。

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

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

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

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

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

还要注意,自Ruby 1.9以来,?与字符一起用作单字符字符串文字的简写。

例如:

?F # => is the same as "F"

这是在ruby文档的字符串文字部分底部附近引用的:

还有一个字符文字表示法来表示单一 字符串,其语法是问号(?)后面跟着 对应于单个的单个字符或转义序列 脚本中的编码点:

?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

这也是一种常见的约定,用于内核#测试测验方法的第一个参数

test ?d, "/dev" # directory exists?
# => true
test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
# => true

如这个问题在这里所示

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

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