Podczas czytania Programming Ruby, natknąłem tym fragmencie kodu:Dlaczego Ruby pozwala mi wywołać metodę String bez określania ciągu znaków?
while gets
num1, num2 = split /,/
end
Choć intuicyjnie zrozumieć, co robi, nie rozumiem składni. "split" to metoda na klasie String - w języku Ruby, który łańcuch jest odbiorcą komunikatu "split" w powyższym scenariuszu?
Widzę w dokumentach, że "dostaje" przypisuje swój wynik do zmiennej $ _, więc domyślam się, że domyślnie używa ona $ _ jako odbiornika - ale cała masa wyszukiwania Google nie potwierdziła tego odgadnąć. Jeśli tak jest, chciałbym wiedzieć, jaka jest ogólna reguła dla metod wywoływanych bez jawnego odbiornika.
Próbowałem kodu w irb, dodałem kilka wywołań diagnostycznych i zweryfikowałem, że rzeczywiste zachowanie jest takie, jakiego można się spodziewać - num1 i num2 otrzymują przypisane wartości, które zostały wprowadzone oddzielone przecinkiem.
'$ _' nadal istnieje (i jest używane przez' gets') w Rubim 1.9, ale metoda 'Kernel # split' zniknęła. Pracował wcześniej nie dlatego, że 'split' był wywoływany na' $ _', ale dlatego, że był wywoływany w 'Kernel'. –
Tak, sformułowałem to bardzo źle. –
@MichelleTilley: jest wywoływany na 'self', który w tym miejscu jest' main', a nie 'Kernel'. 'główna klasa to' Object', a 'Object' dziedziczy z' Kernel' (dokładniej * miesza się w * 'Kernel'), ale to w żadnym wypadku nie oznacza, że metoda jest wywoływana w' Kernel'. (Ty * możesz * teoretycznie nazwać to na 'Kernel', ponieważ' klasa jądra 'to' Module', 'Module' dziedziczy po' Object', która miesza się w 'Kernel', a tym samym' Kernel' jest instancją samego siebie , ale jest to bardzo mylący sposób na wyrażenie tego.) –