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í.
„Vývojář není k objektovému kódu nucen jako v případě Javy nebo Smalltalku. Chcete-li, nemusíte objektový styl vůbec použít.“
Hmm, ale on k tomu není nucen ani v Javě a Smalltalku. V Cčku se dá programovat velmi objektově (àla Gtk+ ;-)) a naopak v Javě nebo Smalltalku můžu narvat všechno do metod jediné třídy a psát strukturovaně se statickými členskými proměnnými jakožto globálními proměnnými. Troufnu si říct, že „stupeň nucení k objektovému psaní“ mi vychází u těchhle dvou jazyků asi tak nastejno, zvlášť když se na ně podívám s odstupem. :-) Pravda je, že Python vypadá o dost uhlazeněji.
Ohledně IronPythonu...myslím, že Boo má větší boodoucnost. ;-) A taky do .NETu líp zapadá. :-)
ad switch vs perl6 doplnim: http://dev.perl.org/perl6/rfc/22.html ad clanek a reference na funkce. Doplnim priklad v perlu: sub nase_fce { my $param = shift; return $param + 1; } print nase_fce(5); my $pointer_na_funkci = \&nase_fce; print &$pointer_na_funkci(5); # Nebo ... # print &{$pointer_na_funkci}(5); # print $pointer_na_funkci->(5); ad clanek a priklad v perlu. Vas priklad v perlu bych trosku upravil: ... while (my $line = <infile>)) { chomp $line; next if $line =~ /^\s*$/; ...
sub my_grep($selector, *@list) { given $selector { when Rule { ... } when Code { ... } when Hash { ... } # etc. } } given want { when Scalar {...} # called in scalar context when List {...} # called in list context when Lvalue {...} # expected to return an lvalue when 2 {...} # expected to return two values # ... }# The want function returns an object that contains information about the context in which the current block, closure, or subroutine was called.
pocitac: {1} perl -d -e 42 Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(-e:1): 42 DB<1> x @array = (1,2); 0 1 1 2 DB<2> x $#array 0 1Jasne jde videt, ze array je pole. Podle '@'.
next if $line =~ m/^$/;
next if $line =~ m/^\s+$/;
A proc to? Kdyz nasledujici podminka stejne tyto pripady odfiltruje. A kdyz uz, proc to nenahradit?:
next if $line =~ m/^\s*$/;
Jinak velkou nevyhodou Pythonu je to odsazovani. Velmi casto pracuji na vzdalenych pocitacich a pokud mate na vzdalenem stroji vi a na lokalnim stroji oznacite text mysi a prenesete ho do jineho okna (na jinem pocitaci), tak z \t\t mate (blize neurceny) shluk mezer a jak jsem vyrozumel, tak v pythonu i problem...No ono to ani není nevýhoda. Spíš jde o to, nepoužívat tab(u)elátor, tedy používat, ale mít v editoru zapnutou konverzi "tabs to spaces". Já osobně, si toto nastavuji všude kde můžu, protože k tvrdému tab(u)elátoru mám odpor již od dob jehličkových tiskáren. To jste taky na některé tiskárně soubor vytiskl a formátování bylo v pořádku, ale někde jinde měla jiná tiskárna jinak nastavený počty mezer pro znak 09H a už to bylo v pytli.
m/^(\w+);(\w+);(\w+);(\d{1,3});(\w|-);(.*);(.*)$/imho nemuze fungovat jak autor zamysli, neb znak strednik je podmnozinou libovolneho znaku reprezentovaneho znakem tecka.
m/^(\w+);(\w+);(\w+);(\d{1,3});(\w|-);([^;]*);([^;]*)$/
@line=split /;/ ;