0

我已经将两个以几种不同方式实现的示例类放在一起,它们很好地反映了我想要在我的 Rails 模型中做的事情。我担心的是,我不知道使用这两种方法有什么问题(如果有的话)。而且我只找到了解释如何实施它们的帖子或使用它们时要避免/小心的一般警告。我还没有找到关于如何安全地完成此操作的清晰解释,以及我要注意什么或为什么我应该避免这种模式。

class X
  attr_accessor :yn_sc, :um_sc
  def initialize
    @yn_sc = 0
    @um_sc = 0
  end
  types = %w(yn um)
  types.each do |t|
    define_method("#{t}_add") do |val|
      val = ActiveRecord::Base.send(:sanitize_sql_array, ["%s", val])
      eval("@#{t}_sc += #{val}")
    end
  end
end

class X
  attr_accessor :yn_sc, :um_sc
  def initialize
    @yn_sc = 0
    @um_sc = 0
  end
  types = %w(yn um)
  types.each do |t|
    # eval <<-EVAL also works
    self.class_eval <<-EVAL 
      def #{t}_add(val)
        @#{t}_sc += val
      end
    EVAL
  end
end


x = X.new
x.yn_add(1) #=> x.yn_sc == 1 for both
4

1 回答 1

1

好吧,你的代码看起来很安全。但是想象一下基于用户输入的代码。它可能看起来像

puts 'Give me an order, sir!'
order = gets.chomp
eval(order)

如果我们的船长发狂并命令我们这样做会发生什么'rm -rf ~/'?肯定是悲伤的事情!

所以上点小课吧。eval不安全,因为它会评估它收到的每个字符串。但是还有另一个使用的原因eval。有时它的评估速度比替代方案慢。感兴趣的看这里

于 2013-11-19T17:53:14.697 回答