なぜNilを使用するのですか?
友達とRubyコードについてチャットしていて、戻り値のトピックが出てきました…
…そしてもちろん、nil
常にその会話の一部です。
その日遅く、私は寝ようとして寝ていました。なぜnil
を使うのか考えました。 ?
翌日これについて書くのはいい考えだと思いました、そしてここにいます。これがおもしろくて、何か新しいことを学んでくれることを願っています!
戻り値と期待される動作について
select
のようなメソッドを呼び出すとき 常に配列を取得します。
選択するものがなくても。
例 :
[1,2,3].select {} # [] [1,2,3].select(&:even?) # [2]
しかし、なぜこれが重要なのでしょうか?
良い質問です!
常に配列を取得する場合は、配列メソッド(size
)を呼び出すことができます 、empty?
、push
…)実際にアレイを操作しているかどうかを確認する必要はありません 。
クラスチェックは高い結合度につながるため、これは良いことです。
より柔軟なコードを記述したい場合は、「これはどのクラスですか」のチェックを避けてください 可能な限り。
単一の値を返す
わかりましたが、find
のようなメソッドを使用するのはどうでしょうか。 、1つの値のみを返しますか?
要素が見つかった場合、それは正常に機能します:
[1,2,3].find { |n| n == 2 } # 2
一致するものがない場合は、find
何かを返す必要があり、false
を返す可能性があります 、ただし、この戻り値でメソッドを呼び出すことを期待している場合は、例外が発生します。
ここでnil
入ってくると、それを使用します。これは、一般的なNullオブジェクトに最も近いものだからです。
nilに関する前回の記事から思い出すかもしれませんが、nil
の方法を紹介しました。 to_i
のようなメソッドを持つクラスです 、to_s
&to_a
。
これにより、Array()
などのメソッドを使用できます 、およびString()
オブジェクトをこれらのタイプに変換します。
例 :
String(123) # "123" String(nil) # "" Array(nil) # []
これは文字列補間でも発生します:
"abc#{nil}dfg"
文字列補間はto_s
を呼び出します 補間ブロックの内部を評価した結果について。したがって、#{1 + 1}
がある場合 これは2.to_s
に変換されます 。
今問題 nil
を使用 予期しないときに 、foo
に応答するオブジェクトだと思います メソッドですが、そうではないので、恐ろしいNoMethodError
例外。
その場合、この記事で説明するように、NullObjectパターンを実装する必要があります。他の解決策には、fetch
の使用が含まれます デフォルト値を使用し、デフォルト値が意味をなさない場合に例外を発生させるメソッド。
概要
nil
を使用する理由を学びました 、nil
でメソッドを呼び出すことによる例外を回避する方法 価値、そしてより自信のあるコードを書く方法。
コードを見て、タイプチェックコードを見つけることができるかどうかを確認してください (is_a?
/ kind_of?
/ ===
)。今日学んだことを使用して、そのコードをどのように改善できますか?
-
HTMLページでheadタグを使用するのはなぜですか?
タグは、HTMLページのすべてのhead要素のコンテナです。 …タグを追加するのは非常に簡単です。その下にドキュメントのタイトル、またはメタ情報、スタイル、スクリプトなどを追加します。 …タグは…タグ内に追加されることに注意してください。 例 次のコードを実行して、HTMLページにタグを追加してみてください <!DOCTYPE html> <html> <head> <title>HTML head tag</title> </
-
HTMLドキュメントでDOCTYPESを使用するのはなぜですか?
HTML タグは、ドキュメントが使用しているHTMLのバージョンを指定するために使用されます。これは、文書型宣言(DTD)と呼ばれます。 宣言は、HTMLドキュメントで最初に表示されるものです。 タグの前に追加されます。 タグには終了タグがありません!。 宣言 HTML 4.01には、HTML 4 Strict、HTML 4 Transitional、およびHTML4Framesetの3つの可能なDoctypeがありました。作成するすべてのHTMLドキュメントには、これら3つのDTDのいずれかが必要です。 HTML4厳密 このドキュメントタイプには、廃止されたものとフレームセットドキュメン