Rubyで変数が文字列かどうかを確認する


回答:


205

あなたが探していると思います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

9
質問の意図を知らなくても、ほとんどの実際のプログラミング状況でis_a?は、実際に使用するのがより適切なイディオムです(そして多くの場合、Andrew Grimmが言及しているようなアヒル入力チェックはさらに優れています)。厳密なクラス比較は通常、コードの匂いです。en.wikipedia.org/wiki/Liskov_substitution_principle
mahemoff 2013年

余談ですが、これを条件付きロジックで使用する場合は、括弧を使用する必要があります。例:if foo.is_a?(String)&& ...
dan

予想通り、このアプローチはだけでStringなく、Integerおよびでも機能しFloatます。それも動作しDecimalますか?(崇高なテキストインタープリターは構文を異なる方法で強調しているため、Decimal疑わしくなります)
stevec

29

よりアヒルを入力するアプローチは言うことでしょう

foo.respond_to?(:to_str)

to_str オブジェクトのクラスが文字列の実際の子孫ではない可能性があることを示しますが、オブジェクト自体は非常に文字列に似ています(文字列?)。


涼しい。この場合、それが、、またはバニラ文字列のfooいずれかになることを偶然知っていますがtruefalseより一般的な解決策を学ぶのは良いことです。
davidchambers、2011年

これをto_s呼び出しと組み合わせて、オブジェクトが対応するかどうかを確認した後、文字列を取得します。
seanmakesgames

1
@seanmakesgamesはもしかしてto_str、またはto_s?2つは少し異なります。
Andrew Grimm


23

できるよ:

foo.instance_of?(String)

そしてより一般的な:

foo.kind_of?(String)

4
kind_ofより一般的なものは何ですか?それらは同義語のようです:is_a
davidchambers

2
@Davidchambersあなたは正しい、 'kind_of?' is_a?の同義語です。
steenslag

@davidchambers:そうです、私はのinstance_of?代わりに意味しましたis_a?
Federico Builes、2011年

7
foo.instance_of? String

または

foo.kind_of? String 

String継承チェーンのどこかから派生したものであるかどうかを気にするだけなら


4

他の回答に加えて、クラスはメソッド===を定義して、オブジェクトがそのクラスのインスタンスであるかどうかをテストします。

  • o.class oのクラス。
  • o.instance_of?co.class == cかどうかを決定します
  • o.is_a?c oはcまたはそのサブクラスのインスタンスですか?
  • o.kind_of?C *のis_aの同義語*?
  • c ===クラスまたはモジュールのo、* o.is_a?c *(String === "s"はtrueを返します)

-1

より良い方法は、いくつかの述語メソッドを作成することだと思います。これにより、「単一制御点」も節約されます。

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

よりアヒルのタイピング方法;)


2
の何が問題になってい"string".is_a?(String)ますか。車輪を再発明しているようです。ありますclassinstance_ofkind_of、モンキーパッチに等...悪い考えではObjectクラスは、それは無用だ言うまでもありません。
モハマド

私は完全にあなたに同意します:)あなたの焦点がプリミティブタイプのみにあり、プリミティブタイプに関連するプロジェクト要件が決して変わらないことを知っている場合(通常はそのケースで;))元気です。ただし、要件が変更された場合は、「単一の制御点」を持つほうが適切です。たとえば、プロジェクト環境では、多くの事前チェック(1000以上)があります。 pre_check("test".is_string?) これでプロジェクトの要件が変わり、3文字以上のすべての文字列が文字列として定義されなくなりました(私はその珍しいことを知っています;))これで、独自のメソッドを簡単に変更できます。
schlegel11 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.