- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
虽然我已经使用了一段时间,但我似乎对这两种方法感到困惑,我无法理解为什么方法 passengers 没有被添加到以下代码中的对象中:
class Bus
def number_of_seats
42
end
end
Bus.class_eval do
define_method :number_of_windows do
number_of_seats
end
def fuel_type
:diesel
end
end
Bus.instance_eval do
define_method :destination do
'Paris'
end
def passengers
12
end
end
bus = Bus.new
bus.number_of_windows # => 42
bus.fuel_type # => :diesel
bus.destination # => "Paris"
bus.passengers # => undefined method `passengers' (NoMethodError)
注意事项:
instance_eval
,只是随机使用了 class_eval
,然后它似乎也起作用了!instance_eval
block 的理解: block 中的代码运行时将 self
设置为调用 instance_eval
的对象。<class_eval
block 的理解: block 中的代码被评估,就好像它是通过打开调用它的对象的类来放置的一样。因此,我对上述案例中的 class_eval
感到困惑!我原以为 Bus 上的 class_eval
意味着评估 Bus Class 的 class
中的 block 。最佳答案
可以引用this关于类和 instance_eval
的精彩文章,关于为什么 passengers 没有被添加到对象。
长话短说:
Bus.class_eval 将
创建实例方法,Bus.instance_eval
将创建类方法。
现在,关于 destination 的行为(可以在实例上调用)......在 class_eval
或 中使用时定义方法>instance_eval
不受通常行为的影响。为什么?
因为文档是这么说的。根据文档:
define method - Defines an instance method in the receiver.
因此,无论您是在 class_eval
还是 instance_eval
中使用 define_method
,它都会创建一个实例方法。
希望这对您有所帮助 :-)。
关于Ruby 元编程 : instance_eval and class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391341/
我这样做有什么区别 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
我是一名优秀的程序员,十分优秀!