W skrócie: w Ruby 1.8 można użyć w wyrażeniu jednego operatora “splat”, tj. kod a = *[], *[] nie wykona się na 1.8 (błąd składni), a w 1.9 jest jak najbardziej prawidłowy.
(edit3) Dość ciekawe, bo różnice są widoczne głównie w przypisaniu. Przy wywoływaniu funkcji wygląda, że działa tak samo (przy czym tak jak poprzednio, w 1.8 można użyć gwiazdki tylko raz):
[code=ruby]def f(a)
puts “#{RUBY_VERSION}: #{a.inspect}”
end
Dokładnie. Wygląda mi to na “bug” w składni Rubiego 1.9. Jak robimy przypisanie
a = b,c
to niejawnie b,c są zamieniane na tablicę. No i ze względu na multiple-splats nie ma możliwości wymuszenia, aby pierwszy argument (przed przecinkiem) był przekazywany jako argument, a nie “zwijany” do tablicy. Dodatkowo w Ruby 1.9 nie mogę zrobić self.test1=(a,*b), bo wywala mi błąd składni (w Ruby 1.8 mogłem).
To jest problem wzięty z Redmine, gdzie jest alias_method_chain dla attributes= Obszedłem to aliasując attributes_wthout…= na attributes_without…, ale jest to brzydki hak.
Widać pomysł z opcjonalnymi argumentami wewnątrz wymaganych jest najgorszym jaki został zaproponowany i wprowadzony do Rubiego 1.9.
Widać Redmine Rubiego nie stoi na Rubim 1.9, bo szybciej by to zauważyli :P[/quote]
Redmine korzysta z jakichś archaicznych Railsów, które wymuszają użycie archaicznego Rubiego ;-).