gpt4 book ai didi

ruby - 我如何使用 class_eval?

转载 作者:数据小太阳 更新时间:2023-10-29 06:31:03 26 4
gpt4 key购买 nike

我不明白 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 用于定义一些方法,方法是计算为定义而编写的文本,然后对其求值。顺便说一句,这里没有必要。一个等效的代码是:

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 版本会打印两次“I can execute anything here”,证明它可以执行任何东西。 define_method 版本不会打印任何内容。

type of code是创造 major vulnerability 的关键对于所有已安装的 Rails 应用程序。

关于ruby - 我如何使用 class_eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3003328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com