Ruby中的方法名可能包含大写和小写字母,数字,下划线_
和标点符号!
,?
,=
。
方法名称不能以数字开头,字符!
,?
和=
只能出现在最后。
非ASCII字符可以在方法名称中使用,但是这可能会导致非常混乱的情况下,不应该是普遍的做法。
这是很好的做法,而不是强制性的,用小写字母开头的方法的名称,因为以大写字母开头的名称是用Ruby常量。它仍然可以使用恒定的名称的方法,但你不能调用它没有括号,因为interpeter将查找的名称为常量:
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
)。
修改其被调用对象的状态或具有不正常行为的方法的最后一个字符为感叹号!
;这种方法有时被称为变异体,因为它们通常是破坏性或其他方法的原地版本(例如Array#sort!
,Array#slice!
,...)。
塞特斯具有等号=
作为最后一个字符(例如Array#[]=
,...);红宝石interpeter提供语法糖用于setter方法invokation:
a = [4, 5, 6]
a[0] = 3 # Shorthand for a.[]=(0, 3)
红宝石还允许使用操作符号作为方法名定义操作符:
╔═══════════════════════════╦═════════════════════════════════════════════╦═══════╗
║ Operators (by precedence) ║ Operations ║ Arity ║
╠═══════════════════════════╬═════════════════════════════════════════════╬═══════╣
║ ! ~ + ║ Boolean NOT, bitwise complement, unary plus ║ 1 ║
║ ║ (define with method name [email protected], Ruby 1.9+) ║ ║
║ ║ ║ ║
║ ** ║ Exponentiation ║ 2 ║
║ ║ ║ ║
║ - ║ Unary minus (define with method name [email protected]) ║ 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不允许您使用运算符语法调用该方法(但它可以使用点语法)。
这是坚持以尽可能多地运营商的原始语义很好的做法:它应该是直观的人谁知道它是如何使用用户定义的类运营商的本义。
该语言还为特殊语言提供语法糖,非运算符,[]
通常用于访问数组和散列值的方法。 []
方法可以用任意的arity来定义。对于表中的每个二元运算符,除了排序,相等,比较和模式匹配外,Ruby还提供缩写赋值的简写(例如,x += y
扩展为x = x + y
);你不能将它们定义为方法,但你可以改变它们的定义它们所基于的操作符的行为。
这些字符都不能在常规方法名称内使用(例如,do&print
或start-up
不是有效的方法名称)。
很好的答案!稍作说明:谓词方法(带'?')返回falsey('nil'或'false')或truethy(其他所有)值是习惯性的,而不是必须的'true'和'false'。返回值旨在用于'if'语句,其行为就像'true'和'false'一样,但实际返回值通常不是预期的方法接口的一部分,只是它是真实或虚假的属性。 –
感谢您的建议,我做了相应的编辑。 –
还有一些字符只能用作整个方法的名字,也就是说你可以定义一个名为 - + * ** /(如果你重载了那些运算符)的方法,而不是一个叫做foo + bar的方法 –