gpt4 book ai didi

Ruby 类 << abcd 语法

转载 作者:数据小太阳 更新时间:2023-10-29 07:50:01 27 4
gpt4 key购买 nike

我知道还有其他关于语法 class << self 的问题.尽管如此,我还是没有找到足够清楚的答案。我有 Java/C#、C 的背景,所以 Ruby 对我来说有点陌生。我读到 class << self指的是单例类。 我觉得这有点复杂,所以我想了解运算符 << 是做什么的在这种情况下做些什么以及两端都可以做什么。我试着写了一个简单的代码来帮助我理解这个语法(我的问题在代码中):

class Self

def Self.selfTest
end

def onSelf
class << Self #I know this might be strange.
self
end

end

def onself
class << self
self
end
end

end

s = Self.new
onSelf = s.onSelf
onself = s.onself

#Here, i wanna know what kind of references are returned.

puts "onSelf responds to onSelf:#{onSelf.respond_to?(:onSelf)}"
puts "onSelf responds to selfTest:#{onSelf.respond_to?(:selfTest)}"
puts "onself responds to onSelf:#{onself.respond_to?(:onSelf)}"
puts "onself responds to selfTest:#{onself.respond_to?(:selfTest)}"

#Output:
#onSelf responds to onSelf:false
#onSelf responds to selfTest:false
#onself responds to onSelf:false
#onself responds to selfTest:true

#So, i conclude that the second one is a reference to a class. What is the first one???????


puts onSelf
puts onself

#Output
#<Class:Self>
#<Class:#<Self:0x007f93640509e8>>

#What does this outputs mean???????

def onSelf.SelfMet
puts 'This is a method defined on base class'
end


def onself.selfMet
puts 'This is a method defined on metaclass'
end



puts "Does Self Class respond to SelfMet? : #{Self.respond_to?(:SelfMet)}"
puts "Does Self Class respond to selfMet? : #{Self.respond_to?(:selfMet)}"
puts "Does Self instance respond to SelfMet? : #{s.respond_to?(:SelfMet)}"
puts "Does Self instance respond to selfMet? : #{s.respond_to?(:selfMet)}"

#Output
#Does Self Class respond to SelfMet? : false
#Does Self Class respond to selfMet? : false
#Does Self instance respond to SelfMet? : false
#Does Self instance respond to selfMet? : false

#Why won't they respond to defined methods????

谢谢

更新:非常感谢大家。我已经阅读和测试了很多,所以会留下一些注意事项。我将此留作将来引用,因此,如果我错了,我希望 Ruby 专家能够纠正我。我意识到 class << Self 指的是 Self 单例类。因此,惯用的 class << abcd 启动了 abcd 单例类上下文。我还意识到类单例类的层次结构不同于对象单例类。类单例类的层次结构遵循层次结构上的所有单例类。在这种情况下:

单例Self->单例对象->单例基本对象->类->模块->对象->内核->基本对象

对象单例类位于一种不同的层次结构中:

Object singleton->Self->Object->kernel->basicObject

这解释了这个输出。

最佳答案

在 Ruby 中,每个对象都有一个单例类。这个单例类只有一个实例:它所属的对象。

由于单例类只有一个实例,并且每个对象都有自己的单例类,因此此类中定义的方法只能在那个特定对象上调用。这些方法通常称为单例方法,尽管这具有误导性:这些方法没有什么特别之处,它们只是普通的标准实例方法。

这是一个例子:

foo, bar, baz = Object.new, Object.new, Object.new

class << foo; def quux; :foo end end
class << bar; def quux; :bar end end

foo.quux # => :foo
bar.quux # => :bar
baz.quux # NoMethodError

类就像任何其他对象一样只是对象。因此,就像任何其他对象一样,它们具有单例类。在恰好是类的对象的单例类中定义的方法通常称为类方法,尽管它们也没有什么特别之处,它们只是恰好是类的对象的单例方法类,这反过来意味着它们只是单例类的常规实例方法,属于一个恰好是类的对象。

因此,如果将其与 Java 类的东西进行比较,您会发现一个二元性:在 Java 中,只有一种类,但有两种方法(实例和静态)。在 Ruby 中,只有一种方法(实例),但可以在不同种类的类(常规类和单例类)中定义。

I find this kinda complex so I would like to understand what does the operator << do in this context

这只是打开单例类而不是打开类的语法。

and what is possible to put on both ends.

好吧,左边必须是关键字 class,右边是任何返回对象的表达式。

关于Ruby 类 << abcd 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617288/

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