Hmmm, já se nad tím konceptem zamyslím. Jestli ono to nemá co dělat se Smalltalkovskou koncepcí OOP, kdy metody jsou de facto "povinně neviditelné" a "metoda zvenčí" je jen selektor, což je v ST symbol...
Když to řeknu jinak, metoda v Ruby JE first-class objekt - podle definice v http://en.wikipedia.org/wiki/First-class_object - ale (v duchu Smalltalku) nemůžete čekat, že bude fungovat konstrukce typu metoda1 = objekt.metoda2. Snad to říkám srozumitelně (a snad to sám chápu správně). :-)
Nějak tomu stále nerozumím. Mně to funguje naprosto bez problémů.
irb(main):001:0> a=1 => 1 irb(main):002:0> b=2.6 => 2.6 irb(main):003:0> c=a.method(:integer?) => #<method: fixnum(integer)#integer?> irb(main):004:0> d=b.method(:integer?) => #<method: float(numeric)#integer?> irb(main):005:0> c.call => true irb(main):006:0> d.call => false
Já sice chápu, že třeba pro Pythonistu vypadá Smalltalkovský přístup nezvykle, ale co se vám na tom nelíbí? Podle mě jsou metody ve Smalltalku i v Ruby first-class object jako vyšitý.
y zavolejAPředejBlok: [ x y | objekt zavolejMetoduSParametrem: x]místo
y volejObjekt: x seSelektorem: #zavolejMetoduSParametrem:. Je to „smallatlkovský pseudokód“, nároky na syntaktickou správnost si nekladu, ale asi chápete. :-D Ale jak vidíte, pokud chcete přímo předat „vázanou metodu“ (říkám to správně po Pythonovsku? :-)), můžete taky. Jen to není obvyklé. Občas se hodí reference na metodu, občas je lepší anonymní blok kódu - má jakožto uzávěr přímý přístup k lokálním proměným volající metody a umožňuje tak tvorbu vlastních řídicích konstrukcí a interních iterátorů. (Externí iterátory člověk může samozřejmě používat taky. ;-)) Ruby se podvolí obojímu. :-) Osobně mi přijde, že oba způsoby mají svá pro a proti a že z typické směsky use-cases vyjdou v průměru tak nějak nastejno. Takže pak už je to jen otázka preferencí. ;-)
1 to: 10 do: [:x | Transcript show: x]. action := MessageSend receiver: Transcript selector: #show:. 1 to: 10 do: action.Jak bloky tak MessageSend se aktivují stejnými metodami, takže jsou při předávání jako parametry ekvivalentní.