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
以确保其内容和类型,并提供实际引发的异常?@NickVeysString#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