Ruby 中的方法名称可以包含大小写字母、数字、下划线_
和标点符号!
, ?
, =
。
方法名不能以数字和字符开头,只能!
出现在末尾。?
=
方法名称中可以使用非 ASCII 字符,但这可能会导致非常混乱的情况,不应该成为常见的做法。
以小写字符开头的方法名称虽然不是强制性的,但这是一种很好的做法,因为以大写字母开头的名称在 Ruby 中是常量。仍然可以为方法使用常量名称,但是如果没有括号,您将无法调用它,因为解释器将查找名称作为常量:
def Capital
nil
end
Capital # NameError: uninitialized constant Capital
Capital() # => nil
在定义方法名称时,一些非常广泛且一致使用的约定是:
方法名称是全小写的,下划线_
作为名称中单词的分隔符(例如Math::sqrt
,,Array#each_index
...)。
谓词有一个问号?
作为最后一个字符(例如Array#empty?
, Hash#has_key?
, ...)。虽然谓词通常返回布尔值,但情况并非总是如此:这些方法只需要返回nil
,或者false
如果谓词评估为假,则返回任何其他值(例如,如果文件不存在则File::size?
返回,文件大小作为否则返回)。nil
Integer
修改调用它们的对象的状态或具有异常行为的方法!
在最后一个字符中带有感叹号;这种方法有时被称为mutators,因为它们通常是其他方法的破坏性或就地版本(例如Array#sort!
, Array#slice!
, ...)。
设置器的最后一个字符是等号=
(例如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 ║
╚═══════════════════════════╩═════════════════════════════════════════════╩═══════╝
一元运算符方法不传递参数;二元运算符方法被传递一个参数,并对它和 on 进行操作self
。
重要的是要严格遵守运营商的严谨性;虽然可以定义具有不同数量的运算符方法(例如,一个带有+
两个参数的方法),但 Ruby 不允许您使用运算符语法调用该方法(但它可以使用点语法)。
最好的做法是尽可能地遵守运算符的原始语义:对于知道运算符的原始含义的人来说,它应该是直观的,它如何与用户定义的类一起工作。
该语言还为通常用于访问数组和哈希值的特殊非运算符方法提供语法糖。[]
该[]
方法可以任意定义。
对于表中的每个二元运算符,除了排序、相等、比较和模式匹配,Ruby 还提供缩写赋值的简写(例如x += y
扩展为x = x + y
);您不能将它们定义为方法,但您可以更改它们的行为,定义它们所基于的运算符。
这些字符都不能在普通方法名称中使用(例如do&print
,或者start-up
不是有效的方法名称)。