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的方法 –