class A
class << self
puts self # self is the singleton class of A
end
end
a = A.new
class << a
puts self # now it's the singleton class of object a
end
并将 * 移位 * 到表达式结果的单例类中。tLSHFT序列将被解析为'NODE_SCLASS'表达式,该表达式被称为 Singleton Class definition(参见node.c)
case NODE_SCLASS:
ANN("singleton class definition");
ANN("format: class << [nd_recv]; [nd_body]; end");
ANN("example: class << obj; ..; end");
F_NODE(nd_recv, "receiver");
LAST_NODE;
F_NODE(nd_body, "singleton class definition");
break;
此处文件
Here Documents* 以完全不同的方式使用'<<'。可以方便地定义跨多行的字符串,方法是声明
here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_
在ruby中,你总是有更多的方法来做事情。所以,Ruby有一些很好的常用方法名的快捷方式。比如这个是for .push,而不是输入.push方法名,你可以简单地使用<<,连接操作符。事实上在某些情况下你可以使用任何一种方法来进行相同的操作。push和+ with <<。 就像你在这个例子中看到的:
alphabet = ["a", "b", "c"]
alphabet << "d" # Update me!
alphabet.push("e") # Update me!
print alphabet
caption = "the boy is surrounded by "
caption << "weezards!" # Me, too!
caption += " and more. " # Me, too!
# .push can no be uses for concatenate
print caption
所以你看到的结果是:
["a", "b", "c", "d", "e"]
the boy is surrounded by weezards! and more.
8条答案
按热度按时间khbbv19g1#
它可以有三种不同的含义:
在大多数情况下,'<<'是一个像其他方法一样定义的方法,在你的例子中,它意味着“添加到这个数组的末尾”(另见这里)。
这是在您的特定情况下,但也有很多其他场合,您会遇到“<<”方法。我不会称之为'operator',因为它实际上是一个在某个对象上定义的方法,可以被你重写或为你自己的对象实现。其他'<<'的情况
Singleton类定义
然后是程序流中当前作用域的神秘转移(=自我的改变):
神秘的
class << self
让我想知道和调查那里的内部。而在我提到的所有例子中,<<
实际上是一个在类中定义的方法,即相当于
class << self
(或任何代替self的对象)结构确实不同。它实际上是语言本身的一个内置特性,在CRuby中,它在 parse.y 中定义为k_class
是'class'关键字,其中tLSHFT
是'<<'标记,expr
是任意表达式。也就是说,你实际上可以写并将 * 移位 * 到表达式结果的单例类中。
tLSHFT
序列将被解析为'NODE_SCLASS'表达式,该表达式被称为 Singleton Class definition(参见node.c)此处文件
为了区分'here doc operator',一个任意的String分隔符必须紧跟在'<'之后。初始分隔符和第二次出现的同一分隔符之间的所有内容都将成为最终字符串的一部分。也可以使用'<<-',区别在于使用后者将忽略任何前导或尾随空格。
trnvg8h32#
通常用于数组中,将值追加到数组的末尾。
给出了这个
结果。
o4tp2gmn3#
'a << B'表示将b附加到a的末尾
eanckbw94#
这个操作符允许你通过追加新的元素来填充现有的数组。
在上面的例子中,你只是用5个新线程填充了空数组
threads
。whlutmcx5#
在ruby中,你总是有更多的方法来做事情。所以,Ruby有一些很好的常用方法名的快捷方式。比如这个是for .push,而不是输入.push方法名,你可以简单地使用<<,连接操作符。事实上在某些情况下你可以使用任何一种方法来进行相同的操作。push和+ with <<。
就像你在这个例子中看到的:
所以你看到的结果是:
你可以使用<<操作符将一个元素推入数组或将一个字符串连接到另一个字符串。
所以,这是做什么,这是创建一个新的元素/对象线程类型,并将其推入数组。
h79rfbju6#
在Ruby中,“<<”操作符基本上用于:
1.在数组中追加一个值(在最后一个位置)
[2,4,6] << 8它将给予[2,4,6,8]
1.它也用于ruby中的一些活动记录操作。例如,我们有一个Cart和LineItem模型,它们关联为cart has_many line_items。Cart.find(A).line_items将返回ActiveRecord::Associations对象,其中的行项目属于购物车'A'。
现在,要将另一个line_item(X)添加(或者说关联)到cart(A),
1.现在将另一个LineItem添加到同一个购物车'A',但这次我们不会创建任何line_item对象(我的意思是不会手动创建activerecord对象)
Cart.find(A).line_items <<LineItem.new
在上面的代码中<<将保存对象并将其附加到左侧活动记录关联数组中。
还有许多其他的问题已经在上面的答案中提到了。
sz81bmfz7#
此外,从Ruby 2.6开始,
<<
方法也在Proc
上定义。Proc#<<允许组合两个或多个proc。
ws51t4hk8#
这意味着添加到末尾(append)。