[解決済み] 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 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回目に現れるまでの間が、最終的な文字列の一部となります。また、'<<-'を使うこともできますが、後者を使うと前後の空白が無視されるという違いがあります。
関連
-
[解決済み] Rubyでファイル名を変更するには?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] w(array)とはどういう意味ですか?
-
[解決済み] Rubyのmap(&:name)ってどういう意味?
-
[解決済み] Rubyで||= (or-equals)はどういう意味ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyで新しい文字列を作成せずに文字列をトリミングする標準的な方法は何ですか?
-
[解決済み】RVMをアンインストールする方法は?[重複] RVMのアンインストール方法
-
[解決済み] Rubyの除算はなぜ10進数ではなく整数を返すのですか?
-
[解決済み] RubyのFile.openで "No such file or directory - text.txt (Errno::ENOENT)" というエラーが発生する。
-
[解決済み] Ruby on railsで改行せずにコンソールに "puts "を使用するにはどうすればよいですか?
-
[解決済み] rubyでto_yamlに書式オプションを指定することはできますか?
-
[解決済み] Capybaraを使ったドロップダウンでのオプションの選択方法
-
[解決済み] Ruby Net::HTTPの実行期限が切れた
-
[解決済み] ルビー.天井と.床
-
[解決済み] OpenSSL AES-256-CBC 暗号化エラー、"間違った最終ブロック長" Ruby