Как изменить подробный код в Ruby на более простой код с помощью метапрограммирования? - PullRequest
1 голос
/ 06 июня 2010

Говорят, что Ruby - это язык метапрограммирования. Интересно, можно ли сделать первые 3 строки менее подробными с помощью метапрограммирования?

RUBY_VERSION ||= "unknown version"
RUBY_PATCHLEVEL ||= "unknown patchlevel"
RUBY_PLATFORM ||= "unknown platform"

print "Ruby ", RUBY_VERSION, " patch ", RUBY_PATCHLEVEL, " on ", RUBY_PLATFORM

Ответы [ 2 ]

3 голосов
/ 06 июня 2010

Это делает работу:

%w{version patchlevel platform}.each{|v| eval "RUBY_#{v.upcase} ||= 'unknown #{v}'"}

но я думаю, что это непрозрачно и неприятно. Я думаю, что ваша оригинальная версия намного лучше. В частности, я думаю, что ||= с константами в любом случае не очень хорош (поскольку константы не должны быть динамическими), и использование eval с константами не является стандартным или, следовательно, ожидаемым. На мой взгляд, сложение условного присваивания, констант и eval приводит к плохому сочетанию.

0 голосов
/ 11 июня 2010

Я думаю, что вы не должны менять значение констант. Вместо этого попробуйте это:

puts "Ruby #{RUBY_VERSION || 'unknown version'}" # ...

Кроме того, используя полезности Rails, вы можете улучшить решение Питера, вызвав

"RUBY_#{v}".constantize

вместо грязного eval; -)

...