<< 在 Ruby 中是啥意思?
Posted
技术标签:
【中文标题】<< 在 Ruby 中是啥意思?【英文标题】:What does << mean in Ruby?<< 在 Ruby 中是什么意思? 【发布时间】:2011-10-14 16:32:55 【问题描述】:我有代码:
def make_all_thumbs(source)
sizes = ['1000','1100','1200','800','600']
threads = []
sizes.each do |s|
threads << Thread.new(s)
create_thumbnail(source+'.png', source+'-'+s+'.png', s)
end
end
<<
是什么意思?
【问题讨论】:
【参考方案1】:'a
【讨论】:
【参考方案2】:它可以有 3 个不同的含义:
'
在大多数情况下,'here)。
这是在你的特殊情况下,但还有很多其他场合你会遇到“的其他情况
字符串连接:“a” 将输出写入 IO:io 将数据写入消息摘要、HMAC 或密码:sha OpenSSL::BN 左移:bn ...单例类定义
然后是程序流程中当前范围的神秘转变(=自我改变):
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
class << self
的谜团让我想知道并调查那里的内部结构。而在我提到的所有示例中,<<
实际上是在类中定义的方法,即
obj << stuff
等价于
obj.<<(stuff)
class << self
(或任何代替 self 的对象)构造确实不同。它实际上是语言本身的内置特性,在 CRuby 中它在 parse.y 中定义为
k_class tLSHFT expr
k_class
是 'class' 关键字,其中 tLSHFT
是 'expr 是任意表达式。也就是说,你实际上可以写
class << <any expression>
并将转移到表达式结果的单例类中。 tLSHFT
序列将被解析为“NODE_SCLASS”表达式,称为单例类定义(参见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_
为了区分“here doc operator”,任意字符串分隔符必须紧跟在“
【讨论】:
非常彻底的答案。可能会使初学者感到困惑,但正如一位智者(可能)所说,“提出一个广泛的问题,得到一个彻底的答案”。 嗨,谢谢@emboss:所以 这是我认为最彻底但仍专注于我在***上红色的主题答案之一。我特别感谢您如何提供有关深奥标识符含义的信息。这种在我们的行业中广泛传播的神秘名字文化只是对已经很难自己掌握的话题造成了更多的障碍。 ?【参考方案3】:它是允许您通过追加新项目来提供现有数组的运算符。
在上面的示例中,您只是用 5 个新线程填充空数组 threads
。
【讨论】:
【参考方案4】:多用于数组中,将值追加到数组末尾。
a = ["orange"]
a << "apple"
puts a
给这个
["orange", "apple"]结果。
【讨论】:
<<
的另一种用法是class inheritance【参考方案5】:
在 ruby 中,你总是有更多的单一方式来做事。因此,Ruby 为常用方法名称提供了一些不错的快捷方式。就像这个用于 .push 而不是输入 .push 方法名称,您可以简单地使用
就像你在这个例子中看到的那样:
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.
您可以使用运算符
所以,这样做的目的是创建一个新的元素/对象 Thread 类型并将其推送到数组中。
threads << Thread.new(s)
create_thumbnail(source+'.png', source+'-'+s+'.png', s)
【讨论】:
【参考方案6】:在ruby中'
在数组中添加一个值(在最后一个位置)
[2, 4, 6]
它还用于 ruby 中的一些活动记录操作。例如,我们将 Cart 和 LineItem 模型关联为 cart has_many line_items。 Cart.find(A).line_items 将返回 ActiveRecord::Associations 对象以及属于购物车“A”的订单项。
现在,将另一个 line_item (X) 添加(或关联)到购物车 (A),
Cart.find(A).line_items << LineItem.find(X)
现在向同一个购物车“A”添加另一个 LineItem,但这次我们不会创建任何 line_item 对象(我的意思是不会手动创建 activerecord 对象)
Cart.find(A).line_items
在上面的代码中
以及上述答案中已经涵盖的许多其他内容。
【讨论】:
不是每个人都知道 【参考方案7】:表示添加到末尾(追加)。
a = [1,2,3]
a << 4
a = [1,2,3,4]
【讨论】:
【参考方案8】:此外,从 Ruby 2.6 开始,<<
方法也在 Proc
上定义。
Proc#<< 允许组合两个或多个 procs。
【讨论】:
以上是关于<< 在 Ruby 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章