15あなたが知っておくべきRubyの奇妙なこと

Rubyは、これまで見たことのない興味深い詳細が数多くある素晴らしい言語です。

この投稿では、これらの詳細のいくつかをリストにまとめました。



1. Heredoc +メソッド



プログラムに埋め込むテキストデータがある場合は、「heredoc」を使用できます。 その結果、次のような文字列を取得します。



input = <<-IN ULL RRDDD LURDL IN
      
      





しかし、これに加えて、後処理を使用して、たとえば、単語に従ってテキストを分割することができます。 Rubyではこれを行うことができます。



 input = <<-IN.split ULL RRDDD LURDL IN
      
      





また、Ruby 2.3では、「波状の」ヒアドキュメント<<〜が登場しました。 インデントに使用されるすべてのスペースを削除します。これは、テキストにヒアドキュメントを使用する際の一般的な問題です。



2.二重コロンを使用してメソッドを呼び出す



たぶん誰かが役に立つでしょう。



 "abc"::size # 3 [1,2,3,4,5]::size # 5
      
      





3.いくつかの引数を指定して



非常に単純なことですが、しばしば便利です。



 puts 1,2,3 1 2 3
      
      





4.無限のインデックスキャプチャ



すぐに例:



 words = ["abc", "foo"] words[0][0][0][0][0]
      
      





もちろん、これは[]が単なるメソッドであり、ストリングでもあるストリングの最初の文字を返すだけなので、機能します。



5.ブロック引数の再構築



いくつかのローカル変数を取り除きたいですか? あなたはそれを好きになるでしょう。



 a = [[1,2],[3,4]] a.each do |(first, last)| # ... end
      
      





と同等:



 a = [[1,2],[3,4]] a.each do |sub_array| first, last = sub_array # ... end
      
      





しかし、それはコードの行を節約します。



6.特別なグローバル変数



括弧付きの正規表現を使用する場合、最初のグループに1ドル、2番目に2ドルなどの特別な定数が定義されます。 それらは通常の変数のように振る舞わないことを覚えておく価値があります:それらは異なるスコープ(メソッドとスレッドに共通)を持ち、再割り当てできません。 それらのリストはここで見ることができます



 $1 = 'test' # SyntaxError: (eval):2: Can't set variable $1
      
      





7.文字列を使用した結合演算子



引数として数値を渡すと、結合演算子(<<)は文字列で期待どおりに機能しません。



 "" << 97 # a
      
      





数値をASCIIコードとして解釈します。 同じための通常の方法:



 97.chr # a
      
      





8.文字リテラル



これが実際に誰にも役立つかどうかはわかりません。



 ?a "a" ?aa # Syntax error
      
      





コメントにあなたがそれについてどう思うかを書くことができます。



9. RbConfigモジュール



RbConfigはドキュメント化されていないモジュールで、Rubyの構成に関する情報が含まれています。 たとえば、RbConfig :: CONFIGには、インタープリターのコンパイルフラグ、バージョン、およびオペレーティングシステムが含まれます。



 RbConfig.constants # [:TOPDIR, :DESTDIR, :CONFIG, :MAKEFILE_CONFIG] RbConfig::CONFIG['host_os'] # "linux-gnu" RbConfig::CONFIG['ruby_version'] # "2.4.0"
      
      





10.スペース、どこでもスペース!



呼び出されたメソッドとレシーバーの間にスペースをいくつでも入れることができます。



 a = [1,2,3] a [0] a .size a . empty?
      
      





ええ、これはRubyの有効な構文です。



11.定数の無限継承



 String::String::Fixnum::Float
      
      





すぐに推測される好奇心:すべてのトップレベル定数(クラス内で定義されていない)はObjectクラスに含まれており、Objectから継承された任意のクラスから呼び出すことができます。 よりよく理解するには、irbのObject.constantsを見てください。



12.シリアル接続オペレーター



<<演算子はチェーンに結合できます。



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





13.始まりと終わり



まれにしか使用されない2つのキーワード。 それらは、通常のアクションが他のプログラムの出力を処理する短いスクリプトを書くことであるPerl / Unixの世界から来たと思います。 仕組み:



 puts 123 BEGIN { puts "Program starting..." }
      
      





このコードは、「123」の前に「Program starting ...」を出力します。 私の読者は、これがすべての「必須」の前に実行されることが保証されるため、「必須」のRUBYLIBへのパスを変更する必要がある場合に役立つと示唆しています。 $ VERBOSEおよびその他の環境定数の設定にも役立ちます。



14.チョザレン



それが言語でどのように、そしてなぜ登場したのかさえわかりません。より慎重に扱うことをお勧めします。 この機能を知っている人はほとんどいないため、理解するのは非常に困難です。 しかし、警告-武装を意味します:



 if (condition1)..(condition2) # do something end
      
      





最初の条件が真である場合、目に見えないレバーが切り替えられ、その瞬間から条件が満たされ、2番目の条件も真になるまで、という考え方です。 例:



 (1..20).each do |i| puts i if (i == 3)..(i == 15) end
      
      





3から15までのすべての数値を印刷しますが、ループで15をスキップすると、印刷を続行します。



15.キーワードのやり直し



ループで繰り返しを繰り返すことを可能にする別のめったに使用されないキーワード。



 10.times do |n| puts n redo end
      
      





条件の下に置くことを忘れないでください、そうでなければ、無限のサイクルが判明します。 したがって、この機能を使用するには注意が必要です。



All Articles