web-dev-qa-db-ja.com

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

<<意味?

58

'<<'通常の方法として

ほとんどの場合、「<<」は他のメソッドと同様に定義されたメソッドであり、あなたの場合は「この配列の最後に追加する」ことを意味します( here も参照)。

それはあなたの特定の場合ですが、「<<」メソッドに遭遇する機会は他にもたくさんあります。これは実際には、ユーザーがオーバーライドしたり、独自のオブジェクトに実装できるオブジェクトで定義されたメソッドであるため、「演算子」とは呼びません。 「<<」の他のケース

  • 文字列の連結: "a" << "b"
  • IOへの出力の書き込み:io << "A line of text\n"
  • メッセージダイジェスト、HMACまたは暗号へのデータの書き込み:sha << "ハッシュされるテキスト"
  • 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

ここで、tLSHFTは「<<」トークン、k_classは「class」キーワード、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 Documentsは再びまったく異なる方法で '<<'を使用します。宣言することにより、複数の行にまたがる文字列を便利に定義できます

here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_

「here doc operator」を区別するには、任意の文字列区切り文字を「<<」の直後に配置する必要があります。その最初の区切り文字と同じ区切り文字の2番目の出現の間のすべてが、最終文字列の一部になります。 '<<-'を使用することもできます。後者を使用すると、先頭または末尾の空白が無視されます。

107
emboss

ほとんどの場合、配列の最後に値を追加するために配列で使用されます。

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

これを与える

  [「オレンジ」、「アップル」] 
26
shajin

appending new itemsでexisting配列にフィードできる演算子です。

上記の例では、空の配列threadsに5つの新しいスレッドを追加しています。

7
Emiliano Poggi

'a << b'は、aの末尾にbを追加することを意味します

6
Aditya Mukherji

In Ruby '<<'演算子は、基本的に次の目的で使用されます。

  1. 配列に値を追加する(最後の位置に)

    [2、4、6] << 8 [2、4、6、8]を与えます

  2. また、Rubyのいくつかのアクティブなレコード操作にも使用されました。たとえば、カートhas_many line_itemsとして関連付けられたCartおよびLineItemモデルがあります。 Cart.find(A).line_itemsは、カート「A」に属する広告申込情報を持つActiveRecord :: Associationsオブジェクトを返します。

ここで、別のline_item(X)をカート(A)に追加(または関連付けと言う)するには、

Cart.find(A).line_items << LineItem.find(X)
  1. 同じカート「A」に別のLineItemを追加しますが、今回はline_itemオブジェクトを作成しません(手動でactiverecordオブジェクトを作成しません)

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

上記のコードでは、<<はオブジェクトを保存し、左側のアクティブレコード関連付け配列に追加します。

そして、上記の回答ですでにカバーされている他の多くの。

4
shubham mishra

Rubyには、常に1つの方法があります。したがって、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.

演算子<<を使用して、要素を配列にプッシュしたり、文字列を別の文字列に連結したりできます。

そのため、これは、新しい要素/オブジェクトスレッドタイプを作成し、それを配列にプッシュすることです。

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