1. ホーム
  2. ruby

[解決済み] Rubyの<<はどういう意味ですか?

2022-03-13 20:20:55

質問

コードがあります。

  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 textn"
  • メッセージダイジェスト、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

k_class は 'class' キーワードです。 tLSHFT は '<<' トークンであり expr は任意の表現である。つまり、実際に書くことができるのは

class << <any expression>

を取得します。 シフト を式の結果のシングルトン・クラスに追加します。また tLSHFT のシーケンスは、「NODE_SCLASS」式としてパースされます。 シングルトン・クラス定義 (cf. 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」を区別するために、「<<」の直後に任意のStringデリミタが必要である。この最初のデリミタと、同じデリミタが2回目に現れるまでの間が、最終的な文字列の一部となります。また、'<<-'を使うこともできますが、後者を使うと前後の空白が無視されるという違いがあります。