如何确保方法返回一个数组,即使 Ruby 中只有一个元素
Posted
技术标签:
【中文标题】如何确保方法返回一个数组,即使 Ruby 中只有一个元素【英文标题】:How to make sure a method returns an array, even when there is only one element in Ruby 【发布时间】:2011-01-29 12:33:21 【问题描述】:我有一个 Ruby 方法,它搜索哈希数组并返回该数组的子集。
def last_actions(type = 'all')
actions = @actions
if type == 'run'
actions = actions.select |a| a['type'] == "run"
end
return actions
end
这可行,除非只有一个动作要返回,在这种情况下,我认为它不会返回一个包含一个元素的数组,而只是返回元素本身。 这在以后会成为问题。
在这种情况下,确保它返回一个包含 1 个元素的数组的好方法是什么?
谢谢。
【问题讨论】:
也许你可以举个例子和产生的错误? 【参考方案1】:select
总是返回一个数组(除非你 break
在块内,但你没有这样做)。所以无论你的代码出了什么问题,这都不是原因。
当然,如果@actions
不包含数组(或其他类型的 Enumerable),则调用 select 将导致异常,并且该方法根本不会返回任何内容。这种情况下的解决方案是确保@actions
始终返回一个数组。如何做到这一点取决于您在哪里/如何设置@actions
。
【讨论】:
你说的很对。后来我用 .last 处理返回值,这就是罪魁祸首。谢谢。【参考方案2】:你的观察很奇怪,但是你可以试试这个:
def last_actions(type = 'all')
actions = @actions.dup || []
actions.delete_if |a| a['type'] != "run" if type == 'run'
actions
end
【讨论】:
【参考方案3】:请注意,有一个干净的 ruby 习惯用法可以确保将单个对象和数组视为数组:
a = [1,2,3]
b = 4
[*a]
=> [1, 2, 3]
[*b]
=> [4]
【讨论】:
不能与哈希一起正常工作:irb(main):001:0> a = id: 1 => :id=>1 irb(main):002:0> [*a] => [[:id, 1]] irb(main):003:0> [a] => [:id=>1] irb(main):004:0> 将代码发布到 pastebin.com 以提高可读性:pastebin.com/aWNebnGj。所以最好使用普通的旧a.kind_of?(Array) ? a : [a]
【参考方案4】:
你也可以这样做:
a = [1,2,3]
b = 4
Array(a)
=> [1, 2, 3]
Array(b)
=> [4]
【讨论】:
与[*a]
技巧相同。不适用于哈希:pastebin.com/aWNebnGj。所以最好使用普通的旧a.kind_of?(Array) ? a : [a]
以上是关于如何确保方法返回一个数组,即使 Ruby 中只有一个元素的主要内容,如果未能解决你的问题,请参考以下文章