- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 User 类:
class User
end
我想使用
.class_eval
定义一个新常量.所以:
User.class_eval { AVOCADO = 'fruit' }
User::AVOCADO
访问它, 我得到 uninitialized constant User::AVOCADO
,但是 User.const_get(:AVOCADO)
作品。为什么?included
中的 Rails 关注中定义一个常量方法并将关注点包含在 User
中类,我可以通过常规 ::
访问它抬头。例如:module FruitConcern
extend ActiveSupport::Concern
included do
AVOCADO = 'fruit'
end
end
class User
include FruitConcern
end
User::AVOCADO
=> 'fruit'
但是,查找
source code对于 ActiveSupport::关注,
included
只是将该块存储在一个实例变量(
@_included_block
)中,然后它会覆盖
append_features
将调用
base.class_eval(&@_included_block)
.
User.class_eval
同一个块,为什么
User::AVOCADO
当常量定义在
included
中时有效阻止,但不是当我打电话时
User.class_eval { AVOCADO = 'fruit' }
直接地?
User.class_eval { AVOCADO = 'teste' }
时,看来 Ruby 也将常量泄漏到顶层。所以:User.const_get(:AVOCADO)
=> "fruit"
AVOCADO
=> 'fruit'
我知道块有平坦的作用域,但常量没有事先定义,我预计
class_eval
更改两者
self
和
default definee
到接收器。这里发生了什么?这个常量是如何在顶层和用户范围内被定义两次的?
最佳答案
有three implicit contexts in Ruby :
self
,“当前对象”:隐式接收器和实例变量的作用域。 def bar
没有明确的目标(即不是 def foo.bar
)。 foo { AVOCADO = 'fruit' }
意思是一样的
AVOCADO = 'fruit'
当然,除非
foo
以某种方式改变了评估块的上下文。我们知道
instance_eval
变化
self
.我们知道
class_eval
变化
self
和默认定义。然而,重要的是:
class_eval
不会更改隐式常量范围。
AVOCADO = 'fruit'
里面
User.class_eval { AVOCADO = 'fruit' }
如果它在块之外,则具有完全相同的含义:
AVOCADO = 'fruit'
换句话说,它与顶层的常量赋值具有相同的含义,正如我们所知,在顶层:
self
是未命名的单例对象,通常称为 main,Object
,加上方法变成 private
默认情况下,和 Object
. AVOCADO
在
Object
中定义.
class User
AVOCADO
end
#=> 'fruit'
因为常量查找首先在词法上“向外”(在这种情况下它失败),然后在继承层次结构中“向上”,它成功了,因为
User
隐式是
Object
的子类.
User.const_get(:AVOCADO)
#=> 'fruit'
也有效,因为这实际上与之前的相同,只是通过反射动态完成:它在类
User
中启动常量查找算法, 就像你写的一样
class User
AVOCADO
end
但是,这不起作用:
User::AVOCADO
老实说,这令人困惑,因为
AVOCADO
应该继承自
Object
.
关于ruby-on-rails - Ruby:使用 class_eval 定义常量只能通过 const_get 找到,但不能直接通过::lookup 找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66751918/
我这样做有什么区别 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
我是一名优秀的程序员,十分优秀!