- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设有人希望创建一个具有类实例变量、该变量的 getter、类方法和实例方法的类。人们可能会写下以下内容。
class C
@v = 1
def hi
'hi'
end
class << self
attr_reader :v
def ho
'ho'
end
end
end
C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1
当然,这可以写成许多其他方式。例如:
class C
@v = 1
def hi
'hi'
end
def self.ho
'ho'
end
singleton_class.class_eval do
attr_reader :v
end
end
C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1
在这两种情况下,class << self
和 singleton_class.class_eval
原因self
从 C
更改至 C.singleton_class
.假设有一个关键字 singleton_class
做同样的事情,允许我们编写以下内容。
class C
@v = 1
def hi
'hi'
end
singleton_class
attr_reader :v
def ho
'ho'
end
end
C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1
可以有另一个关键字允许 self
在 C
之间来回翻转及其单例类,但在 singleton_class
之后要求所有内容可能是最简单的与单例类有关。
使用关键字 singleton_class
之间似乎不会出现冲突。和同名的局部变量或方法。例如,考虑使用关键字 private
:(在写完以下内容后,我了解到我长期以来认为 private
是一个关键字是不正确的;它是不带参数使用的方法 Module#private。我将其留在此处,因为它在评论中被引用。)
class C
def m
private = 'hi'
private
end
private :m
private
def private
'ho'
end
end
c = C.new
c.m
#=> NoMethodError (private method `m' called...
c.send :m
#=> "hi"
c.private
#=> NoMethodError (private method `private' called...
c.send :private
#=> "ho"
我的问题在标题中给出了。也请随意就 Ruby 是否会从引入以这种方式使用的关键字中获益提出意见。
最佳答案
是的。引入新关键字总是会破坏现有代码。
以前,无论你引入什么都是一个有效的标识符,现在不是了。
这就是为什么关键字非常“昂贵”并且应该非常谨慎地使用。 (Ruby 已经有太多了,IMO)。
关于ruby - 引入关键字 "singleton_class"是否会破坏 Ruby 代码或导致其他困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497712/
class Product < ActiveRecord::Base set_table_name 'produce' end module ActiveRecord class Base
我在元类中定义了方法specific_data1和specific_data2,并期望这些方法属于单例类: class User def User.specific_data1 "user
Module#singleton_class 的逆运算是什么?即,给定一个单例类,我怎样才能得到它是单例的模块? 最佳答案 您可以使用 ObjectSpace#each_object为此: modul
当我向 singleton_class 添加验证时,它似乎被分配给了基类,并且它不会触发任何一个。 class Example attr_accessor :title, :some_boolea
为什么 Foo.val 在调用 Foo.set 之前返回 nil 而不是 "foo"? 是否有任何机制可以在类评估时初始化 @val? @val = "foo" 存储在哪个范围内? class Foo
假设有人希望创建一个具有类实例变量、该变量的 getter、类方法和实例方法的类。人们可能会写下以下内容。 class C @v = 1 def hi 'hi' end cla
我这样做有什么区别 class T def initialize self.class.class_eval do def test return self.cl
我们有一个应用程序使用 Sequel gem 连接到数据源,执行一些工作,然后返回一个结果,该结果具有许多附加到该对象的 singleton_class 的便捷方法。在 ruby 2.3 中,此代
根据定义,一个对象的单例类也继承了该对象父类(super class)的单例类。 ruby 中的 BasicObject 没有任何父类(super class),因为它是最基本的级别类 >> Basi
我是一名优秀的程序员,十分优秀!