- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我知道还有其他关于语法 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/
我想写我自己的 compareTo 方法,所以我写了这段简单的代码: public int myCompare(String a, String b) { int min = Math.min
这个问题在这里已经有了答案: Why use parentheses when returning in JavaScript? (9 个回答) 关闭 6 年前。 我正在努力处理一些 JavaScr
void main() { printf("ABCD"); printf("\n"); printf("ABCD" +1); printf("\n"); printf("ABC
为什么在字符串 abcd 1234 abcd 上使用正则表达式 .* 时会得到两个匹配项?请参阅https://regex101.com/r/rV8jfz/1 . 从regex101给出的解释中,我可
为什么在字符串 abcd 1234 abcd 上使用正则表达式 .* 时会得到两个匹配项?请参阅https://regex101.com/r/rV8jfz/1 . 从regex101给出的解释中,我可
def censor2(filename): infile = open(filename,'r') contents = infile.read() contentlist
经过大量的反复试验,我是这样做的: #include #include #include /*Prototype of a hashtag function*/ void hashtag(cha
首先让我承认,通过以不重叠的方式命名类型和变量来避免这种情况很容易。 尽管如此,我很好奇在以下情况下会发生什么: typedef char jimmypage; jimmypage *jimmypag
我正在研究“c 编程语言”练习 2.4,它删除 s1 中与字符串 s2 中的任何字符匹配的每个字符。下面是我的代码,它有效。但是,如果我将 Main 函数中的定义从 char c1[ ]="abcde
所以我们创建了一个 map 。我们想要获取 some_type blah = map_variable[some_not_inserted_yet_value] 如果之前没有创建,这将调用向 map
Directory.GetFiles(LocalFilePath, searchPattern); MSDN 注释: When using the asterisk wildcard characte
到目前为止,当你输入 f 时没有任何反应,它只在输入 0 时有效,但我想要它,所以当你按 f 时,你会得到这个 a ab abc abcd abcde abcdef #include using n
每当我使用 vim 时,按上、下、左、右,它分别映射到 A、B、C、D,但仅限于插入模式。在插入模式之外,这些键可以正常工作。我检查了 .vimrc 文件,没有发现任何可能导致此问题的可疑内容。 我使
给定与属性 ABCD 的关系,知道没有记录具有 NULL 值,如何编写证明函数依赖关系 A → B 的 SQL 语句? 最佳答案 SELECT * from R r1, R r2 where r1.A
我正在使用一些不是我编写的旧代码,并且需要一些帮助来理解它。 (function() { var abc = "SORocks"; $.fn[abc] = function (x) {
昨天我正在解决 Spoj 问题 ABCD:http://www.spoj.com/problems/ABCD/ 我得到了错误的答案,但我真的不明白为什么。我已经尝试了论坛和评论中的所有测试用例。是否接
我有一个像 'g fmnc wms bgblr rpylqjyrc gr zw fylb' 这样的字符串。我在 python 中使用 .split() 函数并获取 ['g', 'fmnc', 'wms
如何编写 Javascript 正则表达式来匹配除给定字符串(“ABCD”)以外的所有内容? 类似于 /[^ABCD]/ 除了我不想匹配所有不是字母 A、B、C 或 D 的东西。我想匹配所有不是的东西
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 8 年前。 String s1 = new String("anil
我知道还有其他关于语法 class #> #What does this outputs mean??????? def onSelf.SelfMet puts 'This is a met
我是一名优秀的程序员,十分优秀!