簡體   English   中英

我如何使用class_eval?

[英]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版本不會打印任何內容。

此類代碼對於為所有已安裝的Rails應用程序創建主要漏洞至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM