Ruby字符串变量返回true for.is_?(数组)

Ruby字符串变量返回true for.is_?(数组),ruby,arrays,Ruby,Arrays,我有一个方法可以获取数组或字符串 为了使方法正常工作,我需要将该字符串转换为数组。 因为它有时会得到字符串,所以我想让它检查变量是否是数组,如果不是,则将其转换为数组。因此,我做了以下工作: unless variablename.is_a?(Array) variablename = variablename.lines.to_a end 第二行失败,我得到一个ruby错误,即“lines”对数组对象不可用 我也试过了,有点?同样的结果 我得到了我的答案,但我也想弄清楚我到底在问什么。

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

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

unless variablename.is_a?(Array)
  variablename = variablename.lines.to_a
end
第二行失败,我得到一个ruby错误,即“lines”对数组对象不可用

我也试过了,有点?同样的结果

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

现在,除非:

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对象比不检查数组更有意义。

您不需要在
行之后检查
。它始终是一个数组。您可以这样做:

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


通过检查
#Array:0x000000021382b8
变量名
可能不是
数组
,而不是检查类型(
是字符串
),我将检查对象是否响应转换所需的方法。假设您希望在作为行数组或(多行)字符串提供的行上进行迭代,类似这样的操作将起作用:

def do_stuff(lines)
  lines = lines.each_line if lines.respond_to?(:each_line)
  lines.each do |line|
    # do stuff
  end
end

能否检查
variablename
以确保其内容和类型,并提供实际引发的异常?@NickVeys
String#to_a
未定义。如果给出的两个答案不正确,然后您需要改进这个问题,因为它不清楚您需要什么。如果在条件之后插入
p variablename.class
,会发生什么?它会说什么?@JonHeckman除非你能给我们看代码或者遵循sawa的简单调试说明,否则我们不会有任何进展。[*“foo\nbar”]将返回
[“foo\nbar”]
,而不是
[“foo\n”,“bar”]
(假设Ruby 1.9或更高版本),所以这不是Jon想要的。这个答案也不能解释为什么Ruby会抱怨
variablename
是类数组的对象,而代码在
中,除非variablename.is_a?(Array)
块,据我所知,这是实际的问题。当然,最有可能的情况是没有,Jon要么向我们歪曲了他的代码、错误消息和/或错误位置。在这种情况下,我假设OP想要
[“foo\nbar”]
。如果不是,那么“问题”就不清楚了(实际上,OP的“问题”中没有问题)。我同意这个问题一般来说不是很清楚,但由于Jon特别称之为
,至少他希望字符串(如果给定字符串)被拆分成行的部分对我来说是清楚的。实际上,这个问题一点也不清楚。我在你的第二条评论中添加了我的答案。我基本上做到了这一点,并让它发挥作用。将其从除非更改为if,并检查字符串。到目前为止,它正在发挥作用。谢谢我只是不明白为什么我会有这个问题。显然,它是一个数组,它不会抱怨它是第2行的数组。@Jon Heckman,我将使用您的除非子句发布一个示例,您可以将其与代码进行比较。
def do_stuff(lines)
  lines = lines.each_line if lines.respond_to?(:each_line)
  lines.each do |line|
    # do stuff
  end
end