0

Rubyでは、メソッド名の最後に疑問符を付けて、戻り値がブール値であることを示す規則があります。ブール値が特別であると見なされるのはなぜですか?メソッドの戻り値が特にブール値であることがわかっている場合、何か便利なものはありますか?結局のところ、Rubyでは、ブール値であるかどうかを気にせずに、あらゆる種類の値を返す(getter)メソッドを条件付きに挿入できます。

ブール値を示すためだけに疑問符を使用するのは無駄だと思います。もっと便利な使い方があるはずです。getterメソッドとsetterメソッドのペアが必要なユースケースがたくさんあります。この場合、setterメソッドはself、メソッドチェーンで使用できるように返される必要があります。そして、それらに何かのような名前を付けて、面倒get_fooに見えます。set_foo規則に従うのではなく、次のようなgetterメソッドとsetterメソッドのペアに名前を付けたいと思います。

def foo?; @foo end
def foo v; @foo = v end

ここで、の値は@foo(必然的に)ブール値ではありません。(慣習を破ると他のプログラマーを混乱させるという潜在的な批判に加えて)、それを行うことに何か問題がありますか?

4

4 に答える 4

4

特別なことは何もありません、それはただの慣習です。質問には「はい」または「いいえ」で答えることができますが、誰かの名前のような別のものでも答えることができます。

疑問符の付いたメソッドにブール値を返すことにより、それが明示的な動作であることを示します。

答えを「はい」または「いいえ」にすると、コードの読者は、実装を見なくてもメソッドの動作を簡単に識別できます。一方、他の型を返すようにすると、読者がクラスとメソッドの定義を読まずにコードを理解するのが難しくなります。

ブール値の場合、考えられる答えは2つだけです。戻り値がブール値でない場合は、何でもかまいませんが、まったく役に立ちません。それでも、メソッドの実装を確認する必要があります。コードの一部を理解するために常にさらに調べる必要がありますが、この規則を使用すると簡単になります。

于 2013-02-21T16:37:36.100 に答える
4

メソッド名に疑問符を使用して、メソッドが述語であることを示す規則があります。AFAIK、この述語は、真/偽の値の単純なルールのおかげで、ブール値を返すために(慣例により)必要ありません。

慣習を破ると他のプログラマーを混乱させるという潜在的な批判に加えて、それを行うことに何か問題がありますか?

紛らわしくて驚くべき仲間のプログラマーは悪いです。Rubyはそれほど気にすることはできませんでした。それは単なる慣習です。そして、慣習には理由があります。

于 2013-02-21T16:38:35.840 に答える
3

フロー制御構造には何でも入れることができますが、意味的にはブール値が適切です。実際の人間の言語での「If」は通常ブール値を取り、同じことが多くのプログラミング言語の構成にも当てはまります。Rubyは物事を便利にするのが好きで、言語のすべてに「真実」の値を割り当てます。これは、ブール値のコンテキストでの動作に影響します。

言い換えると、ブール値はフロー制御にほぼ排他的に使用される唯一のものであるため、慣例では、フロー制御構造に対して「正しく」見えるようにします。それは彼らのネイティブ環境です。

(慣習を破ると他のプログラマーを混乱させるという潜在的な批判に加えて)、それを行うことに何か問題がありますか?

1920年代のコメディアンの後にすべての変数に名前を付けることに何も問題がないのと同じ意味で、いいえ、それは何も問題はありません。しかし、1920年代のコメディアンにちなんですべての変数に名前を付けるのと同じ意味で、それはあまり良い考えではありません。私が知っているどの言語でも、人間でもコンピューターでも、疑問符は「取得する」という意味ではありません。したがって、コードのセマンティクスはその規則とは異なります。

于 2013-02-21T16:45:46.417 に答える
2

この質問と回答は、「驚き最小の原則」として知られる「POLS」に要約されます。

メソッド名は、「!」、「?」を使用して、アンダースコアで区切った文字と数字をランダムに選択できます。そして、私たちがそうすることを選択した場合、「=」がそれらに散りばめられました。それらは実行時にコードによってランダムに作成される可能性があり、残りのコードが同じ文字配置を使用している限り、プログラムは実行され、Rubyは満足します。

私たち人間、プログラマーは、何か、特性、またはアクションを表すために使用されるメソッドの名前を決定します。ランダムに名前が付けられたメソッドを使用しようとすると、狂気につながるか、少なくともプログラムを維持するのが非常に困難になります。そのため、代わりに、物事にわかりやすい名前を使用しようとします。動詞や形容詞の場合もあれば、メソッドがいくつかのことを行うため、より説明的な場合もあります。

その命名の一部として、メソッドの動作に関する追加のヒントを提供したい場合があります。Rubyの慣例により、「!」を使用します。メソッドが何かを変更したり、破壊的であることをコーダーに警告します。「=」は、メソッドがパラメーターを受け取り、それをレシーバー/オブジェクトに割り当てることを示します。これはセッターメソッドであり、他の多くの言語では、名前として「set_flag...」または「set_value...」を使用するのが慣用的です。これはその言語の単なる慣習であり、その言語の開発者がこれに続きます。

を使用しております "?" Rubyで、オブジェクトについて、そのオブジェクトについて真実であるかどうかにかかわらず、質問をします。「is_true?」と言えます。または「本当ですか?」そして、それについて何かが真実であるかどうかをテストしていることを示します。trueまたはfalseの場合、ブール応答であるため、true/false値を返します。

于 2013-02-21T18:12:04.220 に答える