1

我有一个方法可以获取数组或字符串

为了使该方法正常工作,我需要将该字符串转换为数组。因为它有时会得到字符串,所以我想让它检查变量是否为数组,如果不是则将其转换为数组。所以我做了以下事情:

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

第二行失败,我收到一个 ruby​​ 错误,指出数组对象无法使用“行”。

我也试过.kind_of?结果相同

我得到了答案,但我也想弄清楚我到底在问什么。我正在测试变量名是否是一个数组。由于某种原因,当变量名是一个数组时,它仍然运行并且第二行失败并出现以下错误:#Array:0x000000021382b8 (NoMethodError) 的未定义方法 `lines'

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_a之后lines。它始终是一个数组。你可以这样做:

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


用检查看你的错误信息#Array:0x000000021382b8variablename很可能不是Array

于 2013-09-06T17:24:45.817 回答
0

与其检查类型 ( ),不如检查is_a? String对象是否响应转换所需的方法。假设您要迭代作为行数组或(多行)字符串提供的行,这样的事情会起作用:

def do_stuff(lines)
  lines = lines.each_line if lines.respond_to?(:each_line)
  lines.each do |line|
    # do stuff
  end
end
于 2013-09-06T21:35:49.480 回答