以下より慣用的なものはありますか?
foo.class == String
以下より慣用的なものはありますか?
foo.class == String
回答:
あなたが探していると思いますinstance_of?
。is_a?
およびkind_of?
派生クラスからインスタンスに対してtrueを返します。
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
String
なく、Integer
およびでも機能しFloat
ます。それも動作しDecimal
ますか?(崇高なテキストインタープリターは構文を異なる方法で強調しているため、Decimal
疑わしくなります)
よりアヒルを入力するアプローチは言うことでしょう
foo.respond_to?(:to_str)
to_str
オブジェクトのクラスが文字列の実際の子孫ではない可能性があることを示しますが、オブジェクト自体は非常に文字列に似ています(文字列?)。
foo
いずれかになることを偶然知っていますがtrue
、false
より一般的な解決策を学ぶのは良いことです。
to_str
、またはto_s
?2つは少し異なります。
できるよ:
foo.instance_of?(String)
そしてより一般的な:
foo.kind_of?(String)
kind_of
より一般的なものは何ですか?それらは同義語のようです:is_a
。
instance_of?
代わりに意味しましたis_a?
。
より良い方法は、いくつかの述語メソッドを作成することだと思います。これにより、「単一制御点」も節約されます。
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
よりアヒルのタイピング方法;)
"string".is_a?(String)
ますか。車輪を再発明しているようです。ありますclass
、instance_of
、kind_of
、モンキーパッチに等...悪い考えではObject
クラスは、それは無用だ言うまでもありません。
pre_check("test".is_string?)
これでプロジェクトの要件が変わり、3文字以上のすべての文字列が文字列として定義されなくなりました(私はその珍しいことを知っています;))これで、独自のメソッドを簡単に変更できます。
is_a?
は、実際に使用するのがより適切なイディオムです(そして多くの場合、Andrew Grimmが言及しているようなアヒル入力チェックはさらに優れています)。厳密なクラス比較は通常、コードの匂いです。en.wikipedia.org/wiki/Liskov_substitution_principle