Ruby における明示的なキャストと暗黙的な強制:#to_s と #to_str の説明
型強制とは、オブジェクトの型とその値を別の型に変更することです。たとえば、#to_s を使用して整数を文字列に変更します。 または #to_i を使用して Float を整数に変換します 。おそらくあまり知られていない #to_str と #to_int 一部のオブジェクトが実装するメソッドは一見すると同じことを行いますが、いくつかの違いがあります。
AppSignal アカデミーのこの版では、型キャスト アクターについて簡単に触れながら、Ruby での型の明示的なキャストと暗黙的な強制について詳しく説明します。両方の方法の違いを説明し、それらの使用方法について説明します。
まず、通常、明示的なキャスト ヘルパーを使用して、Ruby で値をさまざまな型に強制する方法を見てみましょう。
明示的なキャスト ヘルパー
最も一般的なキャスト ヘルパーは #to_s です。 、#to_i 、#to_a と #to_h 。これらは明示的なキャスト方法です。これらは、値をある型から別の型に簡単に変換するのに役立ちます。
明示的なヘルパーには明確な約束が付いています。 #to_s のとき オブジェクトに対して呼び出される場合、 それは常に行われます。 オブジェクトが実際には文字列にうまく変換されない場合でも、文字列を返します。マイケル・キートンをバットマンにキャスティングするようなものだ。コメディ俳優がその役に特に適していない場合でも、バットマンを演じることができます。
Ruby は、Ruby 標準ライブラリのほぼすべての基本オブジェクトに対してこれらのヘルパー メソッドを提供します。
これらのメソッド、特に #to_s 、Ruby のほとんどの基本的な型に実装されています。キャストではほとんどの場合値が返されますが、結果は期待したものと異なる場合があります。
#to_s に電話をかける 、#to_i 、#to_a と #to_h ヘルパーは、任意の値を選択した型に強制します。値に何が起こったかに関係なく、強制された型の表現を返します。
暗黙的な強制メソッド
キャスト先の型のように動作しない値に対して型キャスト メソッドを呼び出すと、エラーやデータの損失が発生する可能性があります。 Ruby は、オブジェクトが型のように動作する場合にのみ値を返す暗黙的な強制メソッドも提供します。こうすることで、値が必要な型のように動作することを確認できます。これらの暗黙的な強制メソッドは #to_str です。 、#to_int 、#to_ary と #to_hash .
暗黙の強制は、レナード・ニモイをスポック以外の役にキャスティングするようなものだ。キャラクターがスポックに十分近い場合は機能しますが、そうでない場合は失敗します。 #to_str ヘルパーが試してみます 文字列に変換しますが、NoMethodError が発生します。 オブジェクトがメソッドを実装しておらず、暗黙的に強制できない場合。
Ruby の動作がもう少し厳密になり、要求された型を強制しないことがわかります。強制が不可能な場合、#to_* メソッドがオブジェクトに実装されていないため、メソッドを呼び出すと NoMethodError が発生します。 .
暗黙的な強制を使用する場合、例:#to_str 、元の型も String のように動作する場合にのみ、関数に String オブジェクトを返すように要求します。このため、#to_str Ruby 標準ライブラリの String にのみ実装されます。
Ruby が暗黙的な強制を使用する方法
強制中に何を要求するかをより正確にすること以外に、暗黙的な強制は何に役立つのでしょうか? Ruby 自体がかなりのシナリオで暗黙的な強制を使用していることが判明しました。たとえば、オブジェクトを + と組み合わせる場合 .
ここでは、Ruby が TypeError を発行しているのがわかります。 Name からの暗黙的な変換はできないためです。 String に入力します .
#to_str を実装すると Ruby はクラス上で Name を強制する方法を知っています。 タイプします。
配列と #to_ary についても同様です。 .
ただし、#to_ary より多くのシナリオで使用されます。これを使用して、配列を個別の変数に分解できます。
また、オブジェクトをブロック パラメータに変換します。
#to_hash など、暗黙的な強制メソッドが使用されるシナリオは他にもあります。 ** を使用 。これにより、値が #to_hash のハッシュに強制されます。 parse_options に渡す前に メソッド。
タイプの適用
Ruby は、型が未知の型であり、正しい型を確実に取得したい場合に、より回復力のある強制メソッドも提供します。基本タイプごとに 1 つあります (String(...)) 、Integer(...) 、Float(...) 、Array(...) 、Hash(...) 、など)。
String(...) メソッドは最初に #to_str の呼び出しを試みます 値に対して実行し、それが失敗すると、その #to_s を呼び出します。 方法。すべてのオブジェクトが #to_str を定義しているわけではありません したがって、暗黙的な強制 (#to_str) の両方でチェックします。 ) および明示的 (#to_s) ) キャスト メソッドを使用すると、文字列変換が機能し、必要な値が得られる可能性が高くなります。最初に暗黙的な強制を呼び出すことで、"#<Object:0x00007f8e6d053a90>" のようなものではなく、同じ値を持つが強制型の結果が得られる可能性が高くなります。 .
暗黙的なキャスト メソッドは、強制される型のように動作するオブジェクトに対してのみ実装する必要があります。 #to_str 独自の String クラス用。
最初に暗黙的な強制を試みる以外は、String(...) ヘルパーは戻り値の型もチェックします。 #to_str は、文字列以外の値を含む、あらゆる種類の値を返すことができる単なるメソッドです。要求されたタイプ String(...) の値を確実に取得するには TypeError が発生します タイプが一致しない場合。
ここで、Ruby が #to_str の結果を無視していることがわかります。 nil が返されたため 、これは String 型ではありません。代わりに、#to_s にフォールバックします。 結果。
#to_s の場合 nil も返します したがって、正しいタイプではありません、String(...) TypeError が発生します .
これらは型強制を強制する点ではより信頼性が高いかもしれませんが、キャスト ヘルパー メソッド (String(...)) には注意してください。 、Integer(...) 、など)は、指定された値に対してさらに多くのチェックを実行する必要があるため、通常は少し遅くなります。
結論
オブジェクトの正しい型のデータを処理していることを確認したい場合、型強制は便利なプロセスです。この投稿では、#to_s などの明示的なキャスト ヘルパーに関する知識を更新しました。 、#to_i 、#to_a および #to_h 。 #to_str のような暗黙的ヘルパーのインスタンスも調べました。 、#to_int 、#to_ary と #to_hash 便利な機能と、Ruby 自体でそれらがどのように使用されるか。
この型強制の概要が役に立ち、アクターの型キャストの類似点をどのように見つけたかを理解していただければ幸いです。いつものように、取り上げてほしいトピックがあればお知らせください。ご質問やコメントがございましたら、お気軽に @AppSignal までお問い合わせください。
トム・デ・ブルーイン
-
Rubyの正規表現をマスターする
Rubyの正規表現( Ruby regex 略して)さらに処理するためにデータを抽出する目的で、文字列内の特定のパターンを見つけるのに役立ちます。 正規表現の2つの一般的な使用例には、検証と解析が含まれます。 例 : ruby正規表現を含むメールアドレスについて考えてみてください 有効な電子メールアドレスがどのように見えるかを定義できます。つまり、プログラムは有効なメールアドレスと無効なメールアドレスを区別できるようになります。 Rubyの正規表現は2つのスラッシュの間に定義されます それらを他の言語構文と区別するため。最も単純な表現は、単語または1文字にさえ一致します。 例
-
Rubyでプレフィックスツリーを実装して使用する方法を学ぶ
プレフィックスツリー(トライとも呼ばれます)は、単語リストを整理し、特定のプレフィックスで始まる単語をすばやく見つけるのに役立つデータ構造です。 たとえば、「cat」や「cape」など、「ca」で始まるすべての単語を辞書で見つけることができます。 この写真を見てください: これはプレフィックスツリーです。 ルートからフォローできます( * )マークされたノード( e など) およびt )単語を見つける。 この記事では、Rubyで独自のプレフィックスツリーを実装する方法と、それを使用して問題を解決する方法を学習します。 プレフィックスツリーの実装 これをRubyに実装するため