Все методы upcase
, reverse
, next
и swapcase
возвращают String
объекты, и все эти методы предназначены для ... как вы уже догадались, String
объектов!
Когда вы вызываете метод (чаще всего, например, 99,9999% времени), он возвращает объект. Для этого объекта определены методы, которые затем можно вызвать, что объясняет, почему вы можете сделать это:
"Test".upcase.reverse.next.swapcase
Вы даже можете позвонить reverse
столько раз, сколько захотите:
"Test".reverse.reverse.reverse.reverse.reverse.reverse.reverse.reverse
Все, потому что он возвращает объект такого же типа, String
объект!
Но вы не можете сделать это со своим MyClass
:
x = My_Class.new
x.a.b.c
Чтобы это работало, метод a
должен будет возвращать объект, для которого определен метод b
. Прямо сейчас, похоже, что только экземпляры MyClass
имели бы это. Чтобы заставить это работать, вы можете сделать возвращаемое значение a
самого объекта, например так:
def a
@b += 2
self
end
Экстраполируя это, метод b
также должен будет возвращать self
, поскольку метод c
доступен только для экземпляров класса MyClass
. Не важно, что c
возвращает в этом примере, потому что это конец цепочки. Он мог вернуть self
, он не мог. Метод Шредингера кошка . Никто не знает, пока мы не откроем коробку.