-2

大きな配列を比較して、欠落している要素を見つけています。ただし、1 つの配列はすべて大文字になり、もう 1 つの配列は大文字になりません。だから私は1つの配列をフォーマットしたいのですが、問題があります。これは、フォーマットしようとしている配列の例です。

array = [ 023, "Bac001", "abc123"]

それから私はすべてを大文字にしようとします

array.map!(&:upcase)

しかし、023 の未定義のメソッド 'upcase' を取得します

これを回避する方法はありますか?

4

2 に答える 2

5

私は使用しますObject#respond_to?

def upcase_elements(ary)
  ary.map { |e| e.respond_to?(:upcase) ? e.upcase : e }
end

upcase_elements([23, "BAC001", "ABC123"])
#=> [23, "BAC001", "ABC123"]

レシーバーがメソッドに応答するかどうかを確認することは、そのタイプを確認するよりも柔軟です。

upcase_elements([:foo, "bar"])
#=> [:FOO, "BAR"]
于 2013-09-16T15:49:47.033 に答える
4
array.map! { |s| s.kind_of?(String) ? s.upcase : s }

これは、配列の文字列以外の要素を大文字にしようとしません。したがって、次のような配列で機能します。

array = [23, 1.27, "Bac001", "abc123", {:foo => 3}]

収量:

[23, 1.27, "BAC001", "ABC123", {:foo => 3}]
于 2013-09-16T15:30:37.857 に答える