ruby - << 在 Ruby 中是什么意思?

标签 ruby arrays operators

我有代码:

  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/

相关文章:

PHP:比较null中的运算符顺序

ruby - 如何获取调用方法的名称?

arrays - VBA Redim 保留

python - numpy.as_strided 的结果是否取决于输入数据类型?

在 C 中将两个浮点文件合并为一个文件

javascript - 检查数组中的项目

c++ - 后缀的优先级++

ruby-on-rails - 调用内部 Controller Action 并在它们之间发送参数

使用一些通用方法的 Ruby 模块 :where to put this method?

ruby - Ruby 中没有命名参数?