Ответ 1
Имена методов в 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
, если предикат оценивает значение false, любое другое значение в противном случае (например,File::size?
возвращаетnil
, если файл не существует, размер файла какInteger
в противном случае). -
Методы, которые изменяют состояние объекта, на котором они вызывают или имеют необычное поведение, имеют восклицательный знак
!
в качестве последнего символа; эти методы иногда называют мутаторами, потому что они обычно являются деструктивными или локальными версиями других методов (например,Array#sort!
,Array#slice!
,...). -
Сеттеры имеют знак равенства
=
как последний символ (например,Array#[]=
,...); интерпретатор Ruby предлагает синтаксический сахар для вызова методов 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 [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 не позволит вам вызывать метод с синтаксисом оператора (однако он будет работать с точечным синтаксисом).
Хорошей практикой является как можно больше придерживаться исходной семантики операторов: она должна быть интуитивной для того, кто знает исходное значение оператора, как он работает с определенными пользователем классами.
Язык также предлагает синтаксический сахар для специального метода non-operator, []
, который обычно используется для доступа к массиву и хэш-значениям. Метод []
может быть определен с произвольной arity.
Для каждого бинарного оператора в таблице, кроме упорядочения, равенства, сравнения и сопоставления шаблонов, Ruby также предлагает сокращенное обозначение сокращенного присвоения (например, x += y
расширяется до x = x + y
); вы не можете определить их как методы, но вы можете изменить их поведение, определяя операторы, на которых они основаны.
Ни один из этих символов не может использоваться внутри имен обычных методов (например, do&print
или start-up
- недопустимые имена методов).