例如,我在下面的代码片段中找到方法名称 bundler?
,但不知道 ?
字符是专门的关键字还是只是一部分方法名。
# This is a predicate useful for the doc:guides task of applications.
def bundler?
# Note that rake sets the cwd to the one that contains the Rakefile
# being executed.
File.exists?('Gemfile')
end
最佳答案
Ruby 中的方法名可以包含大小写字母、数字、下划线_
和标点符号!
、?
, =
。
方法名不能以数字开头,字符!
、?
和=
只能出现在末尾。
非 ASCII 字符可以用在方法名称中,但这会导致非常困惑的情况,不应该成为常见的做法。
以小写字符开头的方法名称是一种很好的做法,但不是强制性的,因为以大写字母开头的名称在 Ruby 中是常量。仍然可以为方法使用常量名称,但您将无法在没有括号的情况下调用它,因为解释器将查找该名称作为常量:
def Capital
nil
end
Capital # NameError: uninitialized constant Capital
Capital() # => nil
在定义方法名称时,一些非常广泛且一贯使用的约定是:
方法名称完全小写,下划线
_
作为名称中单词的分隔符(例如Math::sqrt
、Array# each_index
, ...).Predicates 以问号
?
作为最后一个字符(例如Array#empty?
、Hash#has_key?
,...)。虽然谓词通常返回 bool 值,但情况并非总是如此:如果谓词的计算结果为假,这些方法只需要返回nil
或false
,否则返回任何其他值(例如File::size?
如果文件不存在则返回nil
,否则返回文件的大小Integer
。修改调用它们的对象的状态或具有异常行为的方法的最后一个字符是感叹号
!
;此方法有时称为 mutators,因为它们通常是其他方法的破坏性或就地版本(例如Array#sort!
、Array#slice!
, ...)。Setter 将等号
=
作为最后一个字符(例如Array#[]=
,...); Ruby interpeter 为调用 setter 方法提供了语法糖:a = [4, 5, 6] a[0] = 3 # Shorthand for a.[]=(0, 3)
Ruby 还允许使用运算符符号作为方法名来定义运算符:
╔═══════════════════════════╦═════════════════════════════════════════════╦═══════╗
║ Operators (by precedence) ║ Operations ║ Arity ║
╠═══════════════════════════╬═════════════════════════════════════════════╬═══════╣
║ ! ~ + ║ Boolean NOT, bitwise complement, unary plus ║ 1 ║
║ ║ (define with method name +@, Ruby 1.9+) ║ ║
║ ║ ║ ║
║ ** ║ Exponentiation ║ 2 ║
║ ║ ║ ║
║ - ║ Unary minus (define with method name -@) ║ 1 ║
║ ║ ║ ║
║ * / % ║ Multiplication, division, modulo ║ 2 ║
║ ║ ║ ║
║ + - ║ Addition, subtraction ║ 2 ║
║ ║ ║ ║
║ << >> ║ Bitwise shift ║ 2 ║
║ ║ ║ ║
║ & ║ Bitwise AND ║ 2 ║
║ ║ ║ ║
║ | ^ ║ Bitwise OR, Bitwise XOR ║ 2 ║
║ ║ ║ ║
║ < <= => > ║ Ordering ║ 2 ║
║ ║ ║ ║
║ == === != =~ !~ <=> ║ Equality, pattern matching, comparison ║ 2 ║
╚═══════════════════════════╩═════════════════════════════════════════════╩═══════╝
一元运算符方法不传递任何参数;二元运算符方法被传递一个参数,并对它和 self
进行操作。
严格遵守运算符的数量很重要;虽然可以定义具有不同元数的运算符方法(例如 +
带有两个参数的方法),Ruby 不允许您使用运算符语法调用该方法(但是它可以使用点语法).
尽可能遵守运算符的原始语义是一种很好的做法:对于了解运算符原始含义的人来说,它应该是直观的,它是如何与用户定义的类一起工作的。
该语言还为通常用于访问数组和哈希值的特殊非运算符 []
方法提供语法糖。 []
方法可以定义为任意数量。
对于表中的每个二元运算符,除了排序、相等、比较和模式匹配之外,Ruby 还提供缩写赋值的简写形式(例如 x += y
扩展为 x = x + y
);您不能将它们定义为方法,但您可以更改它们的行为,定义它们所基于的运算符。
这些字符都不能用在普通方法名称中(例如,do&print
或 start-up
不是有效的方法名称)。
关于ruby - Ruby 中的方法名有什么限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542354/