- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
class Foo
include Module.new { class_eval "def lab; puts 'm' end" }
def lab
super
puts 'c'
end
end
Foo.new.lab #=> m c
============================================= =========================
class Foo
include Module.new { instance_eval "def lab; puts 'm' end" }
def lab
super
puts 'c'
end
end
注意这里我把class_eval改成了instance_eval
Foo.new.lab rescue nil#=> no super class method lab
Foo.lab #=> undefined method lab for Foo class
所以看起来包含模块既没有定义实例方法也没有定义类方法。
有什么解释吗?
此代码在 mac 上的 ruby 1.8.7 上进行了测试。
最佳答案
首先,想想include
做了什么。它使模块的 instance 方法被包含到包含类的 instance 方法中。即除了您的工作示例使用匿名模块这一事实外,它等效于:
module M1
def lab
puts 'm'
end
end
class Foo
include M1
def lab
super
puts 'c'
end
end
接下来,想一想 class_eval
做了什么。它在类或模块的上下文中评估给定的代码。也就是说,这就像您重新打开模块并键入传递给 class_eval
的代码一样。所以 MyModule = Module.new { class_eval "def lab; puts 'm' end"}
等同于
module MyModule
def lab
puts 'm'
end
end
希望这能解释有效的案例。
当您使用 instance_eval
时,您是在接收对象(在本例中为模块的实例)的上下文中评估代码,因此 MyMod2 = Module.new { instance_eval "def lab;把'm'结束"}
等同于
module MyMod2
def MyMod2.lab
puts 'm'
end
end
即它创建一个 module 方法,您可以通过 MyMod2.lab
调用该方法,并且此类方法不会通过 include
添加为实例方法。
请注意:这个答案借用了我写给 previous question asking about instance_eval vs. class_eval 的一个答案中的一些解释。与 The Ruby Programming Language 一书中的示例相关。您可能会发现该答案也有帮助。
关于ruby - 模块中的 instance_eval 与 class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523536/
我这样做有什么区别 class T def initialize self.class.class_eval do def test return self.cl
在以下情况下如何传递参数名称..在传递给 class_eval 之前评估名称 class Foo end Foo.class_eval %Q{ def hello(name) p "hello #
我正在使用 Spree,Spree 有一个名为 Order 的类,如下所示: module Spree class Order # class definition. end end
我正在尝试弄清楚如何动态创建方法 class MyClass def initialize(dynamic_methods) @arr = Array.new(dynamic_method
我正在使用 class_eval 编写要在当前类的上下文中执行的代码。在下面的代码中,我想为属性值的变化添加一个计数器。 class Class def attr_count(attr_name)
我不明白 class_eval。 class Module def attr_ (*syms) syms.each do |sym| class_eval %{def #{sy
是否可以临时将某些方法应用到类中进行测试?我希望能够根据多种应用方式运行规范。虽然我可以制作一堆具有不同设置的装置,但我发现在测试中仅 class_eval 模型更容易。例如: describe "s
我正在尝试运行以下命令,但我不断收到 "NoMethodError: undefined method `bar=' for #/Foo:0x86f69ba/" class Class
虽然我已经使用了一段时间,但我似乎对这两种方法感到困惑,我无法理解为什么方法 passengers 没有被添加到以下代码中的对象中: class Bus def number_of_seats
我试图扩展 code from this question用于保存属性值的记录。但是,如果有多个属性,我的代码就会失败。这是代码: class Class def attr_accessor_wi
我正在测试元编程,但有一个案例我不明白: module Bar def self.append_features klass klass.class_eval do def self
我想写一个方法,它接受一个参数并创建另一个方法,用这个参数命名。这是我的代码 class Class def createMethod(attr_name) attr_name = att
我对使用 class_eval 的 Ruby 变量范围的最佳实践有疑问。 在这段代码中,在 class_eval block 中,局部变量 first 和 second 是未定义的。 def pare
我知道可以使用 class_eval 定义实例方法。是否可以在 class_eval 的上下文中定义类方法? 最佳答案 是的,这是可能的: class Foo end Foo.class_eval d
class_eval 有什么区别吗? & instance_eval工作除了def ?里面class_eval block def定义类自身的方法(即实例方法)和内部 instance_eval de
class String def hello "world" end end String.class_eval { def world "hello" end } "
我正在学习 SaaS 斯坦福类(class),尝试完成 this assignment 的第 5 部分 我很难理解这个概念,这就是我试图做的: class Class def attr_acces
为什么我无法访问 class_eval block 中的变量 vehicle: class Vehicle def self.number_of_wheels fail 'DEFINE i
我发现传递给 class_eval、module_eval 和 instance_eval 的行号与错误报告的行号不匹配。 ruby-doc 未解释此行为其中说:(以 instance_eval 为例
test = "a" test.class_eval do # what is going on here??? end 最佳答案 ActiveSupport 将 class_eval 添加到 O
我是一名优秀的程序员,十分优秀!