1

配列または文字列を取得するメソッドがあります

メソッドが正しく機能するには、その文字列を配列に変換する必要があります。ときどき文字列になるので、変数が配列かどうかチェックして、そうでなければ配列に変換してほしいと思いました。だから私は次のことをしました:

unless variablename.is_a?(Array)
  variablename = variablename.lines.to_a
end

これの 2 行目は失敗し、「行」が配列オブジェクトで使用できないという Ruby エラーが発生します。

私も試してみました.kind_of? 同じ結果で

私は答えを得ましたが、私が何を求めていたのかを明確にしたかったのです。variablename が配列かどうかをテストしています。variablename が配列の場合、何らかの理由で実行され、2 行目で次のエラーで失敗します: undefined method `lines' for #Array:0x000000021382b8 (NoMethodError)

4

3 に答える 3

3
def do_stuff(x)
  x = x.lines.to_a if x.is_a? String
  x
end 

data = [
  "hello\nworld",
  [1, 2, 3]
]

data.each do |item|
  p do_stuff item
end

さて、次の場合を除いて:

def do_stuff(x)
  unless x.is_a?(Array)
    x = x.lines.to_a
  end
  x
end 

data = [
  "hello\nworld",
  [1, 2, 3],
  ['a', 'b']
]

data.each do |item|
  p do_stuff item
end

--output:--
["hello\n", "world"]
[1, 2, 3]
["a", "b"]

ただし、オブジェクトで String メソッドを呼び出す前に、String オブジェクトをチェックする方が、Array ではないかどうかをチェックするよりも理にかなっています。

于 2013-09-06T17:18:56.880 に答える
0

to_aafterは必要ありませんlines。常に配列です。あなたはこれを行うことができます:

case variablename
when Array then variablename
when String then variablename.lines
else p variablename.class # For debugging. This should not happen.
end


インスペクション#Array:0x000000021382b8でエラーメッセージを見ると、variablenameおそらくArray.

于 2013-09-06T17:24:45.817 に答える