Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

なぜ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_sto_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? / === )。今日学んだことを使用して、そのコードをどのように改善できますか?


  1. HTMLページでheadタグを使用するのはなぜですか?

    タグは、HTMLページのすべてのhead要素のコンテナです。 …タグを追加するのは非常に簡単です。その下にドキュメントのタイトル、またはメタ情報、スタイル、スクリプトなどを追加します。 …タグは…タグ内に追加されることに注意してください。 例 次のコードを実行して、HTMLページにタグを追加してみてください <!DOCTYPE html> <html>    <head>       <title>HTML head tag</title>    </

  2. HTMLドキュメントでDOCTYPESを使用するのはなぜですか?

    HTML タグは、ドキュメントが使用しているHTMLのバージョンを指定するために使用されます。これは、文書型宣言(DTD)と呼ばれます。 宣言は、HTMLドキュメントで最初に表示されるものです。 タグの前に追加されます。 タグには終了タグがありません!。 宣言 HTML 4.01には、HTML 4 Strict、HTML 4 Transitional、およびHTML4Framesetの3つの可能なDoctypeがありました。作成するすべてのHTMLドキュメントには、これら3つのDTDのいずれかが必要です。 HTML4厳密 このドキュメントタイプには、廃止されたものとフレームセットドキュメン