1

私は最近、Pythonでこれを行うことができることを発見しました:

array = [1, 2, 3, 4]
if 3 in array:
  print("Yep!")

そして、「えっと、Ruby で違うのはなぜ?if 3 in arrayよりも読みやすい」と思いましたif array.include? 3。その後、Ruby は純粋な OOP であり、このアプローチはキーワード ベースであることに気付きました。

しかし、それでも、私は疑問に思っています。Python のアプローチが OOP ではない場合、Ruby でもっと読みやすい別の短い方法がないのはなぜですか? 考えるとき、「このリストにあの要素が含まれているか」ではなく、「この要素があのリストにあるか」と考えます。

次のコードが可能だったとしましょう。

array = [1, 2, 3, 4]

if 3.in? array
  print "Yep!
end

list.method(element)からへの折り返しであることがわかりますelement.method(list)。だから、私は疑問に思っています:上記のコードに反対するRubyの原則/ルールはどれですか?

編集:おっと、「キーボードベース」と書きましたが、もちろん「キーワードベース」を意味していました。これを強調するために: in? のように動作するメソッドを探しているわけではありません。方法; そのようにRubyに実装されていない理由を探しています。

4

6 に答える 6

7

上記のコードに反対する Ruby の原則/ルールはどれですか?

これは Ruby の原則ではなく、カプセル化の一般的な OOP 原則です。Fixnum クラスは配列について何も知る必要はありません。ただし、配列の主な責任はオブジェクトのコレクションを含めることである#in?か、#include?明らかに配列の責任に該当するためです。

于 2013-02-06T16:11:01.170 に答える
0

最後の文は、発生している問題を説明しています。オブジェクトが配列に存在するかどうかを尋ねることができるはずだと考えていますが、これは意味がありません。配列または配列のようなオブジェクトを検索する方法をどのように知るのでしょうか。

それを好転させることは理にかなっています:「この配列にはオブジェクトが含まれていますか」。配列または配列のようなオブジェクトは、それ自体を検索する方法を知っており、オブジェクトを配列内の要素と比較してみることができます。

于 2013-02-06T16:13:28.580 に答える
0

OO の観点からは、これは他のすべて (または ) のメソッドではなく、include?のメソッドとして理にかなっています。ArrayObject

Python バリアントは、単なる構文糖衣の形式のように見えます。

于 2013-02-06T16:10:37.193 に答える
0

(私は Python の経験がまったくないので、インターネットで読んだことを単に中継しているだけです。)

inメソッドではなく、Python の演算子です。

Python には、文字列、リスト、タプルなどのシーケンスのメンバーシップをテストするメンバーシップ演算子があります。以下で説明する 2 つのメンバーシップ オペレーターがあります。

in指定された順序で変数が見つかった場合は true と評価され、それ以外の場合は false と評価されます。

not in指定された順序で変数が見つからない場合は true と評価され、それ以外の場合は false と評価されます。

http://www.tutorialspoint.com/python/python_basic_operators.htm

私は Ruby の初心者です。配列の前にオブジェクトを書くことを思いとどまらせるRubyの原則を私は知りません。

于 2013-02-06T16:26:59.227 に答える
0

マークがあなたの質問に最もよく答えると思います。あなたの目的のために、caseモジュール、正規表現などの要素を扱っていない限り、ステートメントは関係を逆にする効果があります。

array = [1, 2, 3, 4]

case 3; when *array
  do_something
end
于 2013-02-06T16:27:22.580 に答える
0

rails (active_support) には helper があり、in?あなたが望むように動作します

require 'active_support/core_ext'

3.in?([1, 2, 3]) # => true
于 2013-02-06T16:07:31.130 に答える