Mówi się, że Ruby jest językiem metaprogramowania. Zastanawiam się, czy pierwsze 3 wiersze można zmniejszyć, używając metaprogramowania?
RUBY_VERSION ||= "unknown version"
RUBY_PATCHLEVEL ||= "unknown patchlevel"
RUBY_PLATFORM ||= "unknown platform"
print "Ruby ", RUBY_VERSION, " patch ", RUBY_PATCHLEVEL, " on ", RUBY_PLATFORM
Odpowiedzi:
3 dla odpowiedzi № 1To działa:
%w{version patchlevel platform}.each{|v| eval "RUBY_#{v.upcase} ||= "unknown #{v}""}
ale myślę, że jest nieprzejrzysty i nieprzyjemny. Myślę, że twoja oryginalna wersja jest znacznie lepsza. W szczególności, myślę ||=
ze stałymi i tak nie jest świetne (ponieważ stałe nie powinny być dynamiczne), i to za pomocą eval
ze stałymi nie jest standardem i dlatego jest oczekiwany. Łączenie przypisania warunkowego, stałych i ewaluacji razem jest, moim zdaniem, złym połączeniem.
0 dla odpowiedzi nr 2
Myślę, że nie powinieneś zmieniać wartości stałych. Zamiast tego spróbuj:
puts "Ruby #{RUBY_VERSION || "unknown version"}" # ...
Ponadto, używając gadżetów Rails, możesz ulepszyć rozwiązanie Petera, dzwoniąc
"RUBY_#{v}".constantize
zamiast brudnych eval
;-)