< < 在Ruby中是什么意思?

xoshrz7s  于 2023-05-17  发布在  Ruby
关注(0)|答案(8)|浏览(143)

我有代码:

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

<<是什么意思

khbbv19g

khbbv19g1#

它可以有三种不同的含义:

  • '<<'作为普通方法*

在大多数情况下,'<<'是一个像其他方法一样定义的方法,在你的例子中,它意味着“添加到这个数组的末尾”(另见这里)。
这是在您的特定情况下,但也有很多其他场合,您会遇到“<<”方法。我不会称之为'operator',因为它实际上是一个在某个对象上定义的方法,可以被你重写或为你自己的对象实现。其他'<<'的情况

  • 字符串串联:“a”<<“B”
  • 将输出写入IO:io <<“一行文本\n”
  • 将数据写入消息摘要、HMAC或密码:sha <<“要散列的文本”
  • OpenSSL::BN的左移:bn << 2
  • ...
    Singleton类定义

然后是程序流中当前作用域的神秘转移(=自我的改变):

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'表达式,该表达式被称为 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_

为了区分'here doc operator',一个任意的String分隔符必须紧跟在'<'之后。初始分隔符和第二次出现的同一分隔符之间的所有内容都将成为最终字符串的一部分。也可以使用'<<-',区别在于使用后者将忽略任何前导或尾随空格。

trnvg8h3

trnvg8h32#

通常用于数组中,将值追加到数组的末尾。

a = ["orange"]
a << "apple"
puts a

给出了这个

["orange", "apple"]

结果。

o4tp2gmn

o4tp2gmn3#

'a << B'表示将b附加到a的末尾

eanckbw9

eanckbw94#

这个操作符允许你通过追加新的元素来填充现有的数组。
在上面的例子中,你只是用5个新线程填充了空数组threads

whlutmcx

whlutmcx5#

在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.

你可以使用<<操作符将一个元素推入数组或将一个字符串连接到另一个字符串。
所以,这是做什么,这是创建一个新的元素/对象线程类型,并将其推入数组。

threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }
h79rfbju

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),

Cart.find(A).line_items << LineItem.find(X)

1.现在将另一个LineItem添加到同一个购物车'A',但这次我们不会创建任何line_item对象(我的意思是不会手动创建activerecord对象)
Cart.find(A).line_items <<LineItem.new
在上面的代码中<<将保存对象并将其附加到左侧活动记录关联数组中。
还有许多其他的问题已经在上面的答案中提到了。

sz81bmfz

sz81bmfz7#

此外,从Ruby 2.6开始,<<方法也在Proc上定义。
Proc#<<允许组合两个或多个proc。

ws51t4hk

ws51t4hk8#

这意味着添加到末尾(append)。

a = [1,2,3]
a << 4
a = [1,2,3,4]

相关问题