我有代码:
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
什么是<<
什么意思?
最佳答案
它可以有 3 个不同的含义:
'<<'作为普通方法
在大多数情况下,'<<' 是像其他方法一样定义的方法,在您的情况下,它意味着“添加到该数组的末尾”(另请参见 here)。
那是在您的特定情况下,但还有很多其他情况您会遇到“<<”方法。我不会称它为“运算符”,因为它实际上是在某个对象上定义的方法,您可以覆盖该方法或为您自己的对象实现。 '<<'
的其他情况- 字符串连接:"a"<< "b"
- 将输出写入 IO:io << "A line of text\n"
- 将数据写入消息摘要、HMAC 或密码:sha << "Text to be hashed"
- OpenSSL::BN 的左移:bn << 2
- ...
单例类定义
然后是程序流程中当前范围的神秘转变(= self 改变):
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
(或任何代替自身的对象)构造是真正不同的。它实际上是语言本身的内置功能,在 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”,任意字符串定界符必须紧跟在“<<”之后。初始定界符和同一定界符第二次出现之间的所有内容都将成为最终字符串的一部分。也可以使用 '<<-',区别在于使用后者会忽略任何前导或尾随空格。
关于ruby - << 在 Ruby 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852072/