我如何使用class_eval?
我不懂class_eval
。
class Module def attr_ (*syms) syms.each do |sym| class_eval %{def #{sym}= (val) @#{sym} = val end} end end end
%
是什么意思?
class_eval
做什么?
(val)
来自哪里?
简短的回答是:您可能希望避免像这样使用class_eval
。
这是您的代码的解释:
%{hello}
只是在Ruby中编写字符串文字的另一种方法,而不必担心在字符串中转义双引号或单引号:
%{hello "world"} == "hello \"world\"" # => true
代码中的val
是要定义的方法的参数。
class_eval
用于通过计算用于执行定义然后对其进行评估的文本来定义一些方法。 BTW,这里没有必要。 等效的代码是:
class Module def attr_ (*syms) syms.each do |sym| define_method "#{sym}=" do |val| instance_variable_set "@#{sym}", val end end end end
这相当于内置的attr_writer
。
更新 :两者之间实际上可能存在显着差异……
如果你不能信任参数syms
那么class_eval
版本是易受攻击的。 例如:
class Foo attr_ "x; end; puts 'I can execute anything here!'; val=42; begin; val" end
class_eval
版本将打印“我可以在这里执行任何操作”两次,certificate它可以执行任何操作。 define_method
版本不会打印任何内容。
此类代码对于为所有已安装的Rails应用程序创建主要漏洞至关重要。