Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用元编程将Ruby中的冗长代码更改为更简单的代码?_Ruby_Metaprogramming - Fatal编程技术网

如何使用元编程将Ruby中的冗长代码更改为更简单的代码?

如何使用元编程将Ruby中的冗长代码更改为更简单的代码?,ruby,metaprogramming,Ruby,Metaprogramming,据说Ruby是一种元编程语言。我想知道是否可以使用元编程来减少前3行的冗长 RUBY_VERSION ||= "unknown version" RUBY_PATCHLEVEL ||= "unknown patchlevel" RUBY_PLATFORM ||= "unknown platform" print "Ruby ", RUBY_VERSION, " patch ", RUBY_PATCHLEVEL, " on ", RUBY_PLATFORM 这就是工作: %w{version

据说Ruby是一种元编程语言。我想知道是否可以使用元编程来减少前3行的冗长

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

print "Ruby ", RUBY_VERSION, " patch ", RUBY_PATCHLEVEL, " on ", RUBY_PLATFORM
这就是工作:

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

但我认为这是不透明和令人不快的。我觉得你原来的版本好多了。特别是,我认为带常量的
| |=
并不好(因为常量不应该是动态的),而且带常量的
eval
不是标准的,因此也不是预期的。在我看来,将条件赋值、常量和求值放在一起会造成一个糟糕的组合。

我认为不应该更改常量的值。相反,请尝试以下方法:

puts "Ruby #{RUBY_VERSION || 'unknown version'}" # ...
另外,使用Rails goodies,您可以通过调用

"RUBY_#{v}".constantize

而不是脏的
eval
;-)

+1用于解释。我认为原版也更好。