我想创建一个返回数组第一个元素的方法,如果它不存在则返回nil。
def by_port(port)
@collection.select{|x| x.port == port }
end
我知道我可以将结果分配给变量,如果数组为空则返回nil,否则返回nil,如:
答案 0 :(得分:5)
我认为您在问题描述中遗漏了一些内容 - 您似乎希望数组的第一个元素符合某个条件,或者nil
如果没有确实。由于使用了#select
的块,我得到了这种印象。
所以,实际上,您想要的方法已经存在:它Array#detect
:
detect(ifnone = nil) { |obj| block }
→obj
或nil
detect(ifnone = nil)
→an_enumerator
将
enum
中的每个条目传递给block
。返回block
不是false
的第一个。如果没有对象匹配,则调用ifnone
并在指定时返回其结果,否则返回nil
。
以及它的例子:
(1..10).detect { |i| i % 5 == 0 and i % 7 == 0 } #=> nil (1..100).find { |i| i % 5 == 0 and i % 7 == 0 } #=> 35
所以,在你的情况下:
@collection.detect { |x| x.port == port }
应该有用。
答案 1 :(得分:4)
def foo array
array.first
end
foo([1]) # => 1
foo([]) # => nil