これまでに見たことのない11のRubyトリック
クールなRubyのトリックをお探しですか?
あなたはそれらを見つけました!
この記事では、私のお気に入りのいくつかをあなたと共有したいと思います。
コンテンツ
- 1ディープコピー
- ラムダを呼び出す2つの方法
- 3事前に入力された配列の作成
- 4 true、false、nilはオブジェクトです
- 5ラムダは引数に厳密ですが、Procsは気にしません
- 6irbやファイルを使用せずにコードを直接実行する
- 71つのコマンドで独自のミニirb
- 8オブジェクトのフリーズを解除します(危険です!)
- 特別なアイデンティティを持つ9つのオブジェクト
- 10irbまたはpryで大きな出力を避ける
- 11呼び出し元メソッドを使用して現在の呼び出しスタックを取得する
- 12ボーナス!任意の値をブール値に変換します
- 13ボーナス!キーワードを変数名として使用する
- 14まとめ
- 14.1関連
ディープコピー
コピーコード>するとき
Array
などの他のオブジェクトを含むオブジェクト 、これらのオブジェクトへの参照のみがコピーされます。
ここで実際に動作していることがわかります:
food = %w( bread milk orange ) food.map(&:object_id) # [35401044, 35401020, 35400996] food.clone.map(&:object_id) # [35401044, 35401020, 35400996]
Marshal
を使用する 通常はシリアル化に使用されるクラスで、オブジェクトの「ディープコピー」を作成できます。
def deep_copy(obj) Marshal.load(Marshal.dump(obj)) end
結果:
deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612]
ラムダを呼び出すさまざまな方法
my_lambda = -> { puts 'Hello' } my_lambda.call my_lambda[] my_lambda.() my_lambda.===
可能であれば、最初のものに固執する必要があります( call
)、それはほとんどの人が知っているものだからです。
事前に入力された配列の作成
Arrayクラスは、引数+ブロックを取ることができます。これにより、 n
で配列を作成できます。 要素。デフォルトでは、これらの要素は nil
です。 、ただし、ブロックがある場合、値はそのブロックから取得されます。
例 :
Array.new(10) { rand 300 }
これにより、0〜299の10個の乱数を含む配列が生成されます。
true、false、nilはオブジェクトです
true.class # TrueClass false.class # FalseClass nil.class # NilClass
これらのオブジェクトのコピーは1つしかないため、必要な場合でもそれ以上作成することはできません。
これが動作中のシングルトンパターンです。
ラムダは引数に厳密ですが、Procsは気にしません
my_lambda = ->(a, b) { a + b } my_proc = Proc.new { |a, b| a + b } my_lambda.call(2) # ArgumentError: wrong number of arguments (1 for 2) my_proc.call(2) # TypeError: nil can't be coerced into Fixnum
irbやファイルを使用せずにコードを直接実行する
ruby
コマンドには、使用できる興味深いオプションがいくつかあります。
たとえば、 -e
を使用します 実行するコードのスニペットを渡すことができるフラグ。
ruby -e '5.times { puts "Fun with Ruby" }'
-h
を使用して詳細を確認できます フラグ。
1つのコマンドで独自のミニirb
irb
の方法を知りたいと思ったことはありませんか 動作しますか?まあ、これはそれの超単純なバージョンです。
「REPL」の意味を覚えておいてください:Read-Eval-PrintLoop。
ruby -n -e 'p eval($_)'
プロンプトは表示されませんが、先に進んでRubyコードを入力してください。
"A" * 5 "AAAAA"
これは、 -n
が機能するために機能します フラグはこれを行います:
-n assume 'while gets(); ... end' loop around your script
そして$_
グローバル変数です。これには次のものが含まれます:
The last input line of string by gets or readline.
オブジェクトのフリーズを解除します(危険です!)
オブジェクトのフリーズを解除するRubyメソッドはありませんが、 Fiddle
を使用します それを実現するためにRuby内部に到達できるクラス。
require 'fiddle' str = 'water'.freeze str.frozen? # true memory_address = str.object_id * 2 Fiddle::Pointer.new(memory_address)[1] &= ~8 str.frozen? # false
家でこれを試さないでください!
特別なアイデンティティを持つオブジェクト
Rubyオブジェクトには、 object_id
を使用してアクセスできる識別子または「id」番号があります 方法。一部のオブジェクトのIDは固定されています:Fixnums、true、false、nil。
false.object_id # 0 true.object_id # 2 nil.object_id # 4 1.object_id # 3 2.object_id # 5
Fixnum IDは、次の式を使用します:(数値* 2)+1。
ボーナス:最大Fixnumは 1073741823
、その後、Bignumオブジェクトを取得します。
irbまたはpryで大きな出力を避ける
irb
で作業している場合 ;
を追加するだけで、画面が非常に大きな配列や文字列のコンテンツでいっぱいになるのを避けたい場合は、 コードの最後に。
例 :
require 'rest-client' RestClient.get('www.rubyguides.com');
;
なしで再試行してください 違いを確認するために🙂
呼び出し元メソッドを使用して現在の呼び出しスタックを取得する
コード例は次のとおりです。
def foo bar end def bar puts caller end foo
出力 :
-:3:in 'foo' -:10:in '<main>'
現在のメソッド名が必要な場合は、 __ method __
を使用できます または__callee __
。
ボーナス!任意の値をブール値に変換します
!!(1) # true !!(nil) # false
ボーナス!キーワードを変数名として使用する
def foo (if: nil) binding.local_variable_get(:if) end foo(if: true)
概要
これらのRubyのトリックを楽しんでいただけたでしょうか。
友達と共有して、友達も楽しんでください。私のブログを購読 次の投稿を見逃さないように、以下のフォームに記入してください。 🙂
-
Ruby定数について知っておくべきことすべて
Rubyの定数とは何ですか? 定数は、常に大文字で始まる変数の一種です。それらは外部でのみ定義できます メタプログラミングを使用しない限り、メソッドの数。 定数は変更されるべきではない値に使用されますが、Rubyはそれらの変更を妨げません。 このように見えます : FRUIT = orange 今 : 定数は重要なトピックであるため、この記事で詳細に説明します。 定数の定義方法 定数は、宣言するために特別な記号や構文を必要としません。最初の文字を大文字にする必要があります。 以下は有効な定数です : ABC = 1 Goo = 2 Foo = 3 メソッド内で定数を定義
-
Apple TV 4K:知っておくべき 10 のヒントとコツ
新しい Apple TV を手に入れましたか?読む! Apple が初めての Apple TV をリリースしてからしばらく経ちました。しかし、時間の経過とテクノロジーの進歩により、Apple は後継者ごとに明確に進化してきました。それらの最新のものは、最近リリースされた Apple TV 4K です。 Apple TV 4K は、エンターテイメント システムに多くの価値を追加する非常に便利なガジェットです。ニュース、天気予報、2 つのストレージ オプションなど、便利な機能を豊富に備えたポータブルで効率的なデバイス。 最初にはっきりと見える機能がたくさんありますが、ユーザーが気付いていな