簡體   English   中英

<< 在 Ruby 中是什么意思?

[英]What does << mean in Ruby?

我有代碼:

  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 個不同的含義:

'<<' 作為普通方法

在大多數情況下, '<<' 是一種與其他方法一樣定義的方法,在您的情況下,它的意思是“添加到此數組的末尾”(另請參見此處)。

那是在您的特定情況下,但還有很多其他場合您會遇到“<<”方法。 我不會稱它為“運算符”,因為它實際上是在某些對象上定義的方法,可以由您覆蓋或為您自己的對象實現。 '<<'的其他情況

  • 字符串連接:"a" << "b"
  • 將輸出寫入 IO: io << "A line of text\\n"
  • 將數據寫入消息摘要、HMAC 或密碼:sha << "Text to be hashed"
  • OpenSSL::BN 的左移:bn << 2
  • ...

單例類定義

然后是程序流程中當前范圍的神秘轉移(=自我的改變):

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_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_

為了區分“here doc operator”,任意字符串定界符必須緊跟在“<<”之后。 初始分隔符和同一分隔符第二次出現之間的所有內容都將成為最終字符串的一部分。 也可以使用 '<<-',區別在於使用后者將忽略任何前導或尾隨空格。

主要用於數組中以將值附加到數組的末尾。

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

給這個

["orange", "apple"]
結果。

它是允許您通過附加新項目來提供現有數組的運算符。

在你上面的例子只是填充空數組threads 5級新的線程。

在 ruby​​ 中,你總是有更多的單一方式來做事。 因此,Ruby 為常用方法名稱提供了一些不錯的快捷方式。 就像這個用於 .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.

您可以使用運算符 << 將元素推入數組或將字符串連接到另一個。

所以,這樣做的目的是創建一個新的元素/對象 Thread 類型並將其推送到數組中。

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

在 ruby​​ 中,'<<' 運算符主要用於:

  1. 在數組中附加一個值(在最后一個位置)

    [2, 4, 6] << 8 它會給出 [2, 4, 6, 8]

  2. 它還用於 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)
  1. 現在將另一個 LineItem 添加到同一個購物車“A”,但這次我們不會創建任何 line_item 對象(我的意思是不會手動創建 activerecord 對象)

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

在上面的代碼中,<< 將保存對象並將其附加到左側活動記錄關聯數組。

以及上面答案中已經涵蓋的許多其他內容。

'a << b' 表示將 b 添加到 a 的末尾

此外,從 Ruby 2.6 開始, <<方法也在Proc上定義。

Proc#<<允許組合兩個或多個 proc。

這意味着添加到最后(追加)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM