[英]How do I use 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
版本將打印“我可以在這里執行任何操作”兩次,證明它可以執行任何操作。 define_method
版本不會打印任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.