Ruby:如何从Ruby每个方法返回单值
下面的代码在方法末尾返回哈希值。我要做的是返回相同的响应,而不在方法的开头声明response={}。如何在ruby中实现这一点Ruby:如何从Ruby每个方法返回单值,ruby,Ruby,下面的代码在方法末尾返回哈希值。我要做的是返回相同的响应,而不在方法的开头声明response={}。如何在ruby中实现这一点 def test response = {} objects.each do |object| response = object.fetch(55) break unless response.nil? end response end Ruby自动返回放在最后一行的值,这样您就可以使用logicc了。
def test
response = {}
objects.each do |object|
response = object.fetch(55)
break unless response.nil?
end
response
end
Ruby自动返回放在最后一行的值,这样您就可以使用logicc了。Ruby自动返回放在最后一行的值,这样您就可以使用logicc了。您想返回fetch(55)的第一个结果吗?我会这样写下来
def test
objects.lazy.map{|o| o.fetch(55)}.reject(&:nil?).first
end
是否要返回
fetch(55)
的第一个结果?我会这样写下来
def test
objects.lazy.map{|o| o.fetch(55)}.reject(&:nil?).first
end
如果为给定数组的每个元素获取一个值(可能是一个散列)很便宜,那么可以编写以下代码
def test1(arr)
arr.find { |h| h[55] }&.[](55)
end
否则我建议
def test2(arr)
v = nil
arr.find { |h| v = h[55] } && v
end
即使它不符合你的要求<代码>&中的第一个是,它在Ruby v2.3中首次亮相。所谓“便宜”,我的意思是不需要进行大量计算来确定密钥的值(例如,将pi计算到一百万位)。看
假设
a1 = [{ 9=>'cat', 14=>'dog', 12=>'pig' }, { 9=>'cat', 55=>'dog', 12=>'pig' }]
a2 = [{ 9=>'cat', 14=>'dog', 12=>'pig' }, { 9=>'cat', 12=>'dog', 12=>'pig' }]
然后
正如注释中指出的,以下是test1
的一个变体
def test1(arr)
arr.find(->{{}}) { |h| h[55] }[55]
end
具体请参见,如果未找到匹配项,并且
find
具有响应调用的参数(即过程或方法),则调用该参数并由find
返回结果。(要使用方法而不是过程:def m(){}end;arr.find(method(:m)){h | h[55]}[55]
)如果为给定数组的每个元素(可能是散列)获取值很便宜,您可以编写以下代码
def test1(arr)
arr.find { |h| h[55] }&.[](55)
end
否则我建议
def test2(arr)
v = nil
arr.find { |h| v = h[55] } && v
end
即使它不符合你的要求<代码>&
中的第一个是,它在Ruby v2.3中首次亮相。所谓“便宜”,我的意思是不需要进行大量计算来确定密钥的值(例如,将pi计算到一百万位)。看
假设
a1 = [{ 9=>'cat', 14=>'dog', 12=>'pig' }, { 9=>'cat', 55=>'dog', 12=>'pig' }]
a2 = [{ 9=>'cat', 14=>'dog', 12=>'pig' }, { 9=>'cat', 12=>'dog', 12=>'pig' }]
然后
正如注释中指出的,以下是test1
的一个变体
def test1(arr)
arr.find(->{{}}) { |h| h[55] }[55]
end
具体请参见,如果未找到匹配项,并且
find
具有响应调用的参数(即过程或方法),则调用该参数并由find
返回结果。(要使用方法而不是过程:defm(){}end;arr.find(method(:m)){h | h[55]}[55]
)为什么不从块返回
def test
objects.find do |object|
response = object.fetch(55)
return response if response
end
end
请注意,这仅在方法中有效。例如,如果在irb中尝试此操作,则会出现LocalJumpError
如果您只是想从块中获取值,而不是从方法中实际返回,请使用break
:
def test
response = objects.find do |object|
response = object.fetch(55)
break response if response
end
end
为什么不从块中返回
def test
objects.find do |object|
response = object.fetch(55)
return response if response
end
end
请注意,这仅在方法中有效。例如,如果在irb中尝试此操作,则会出现LocalJumpError
如果您只是想从块中获取值,而不是从方法中实际返回,请使用break
:
def test
response = objects.find do |object|
response = object.fetch(55)
break response if response
end
end
如果您只是在集合中查找与条件匹配的第一个实例,ruby有一个惯用的解决方案:
如果您只是在集合中查找与条件匹配的第一个实例,ruby有一个惯用的解决方案:
objects.each{…}
返回对象
(each
始终返回其接收器),因此删除行响应
将导致返回对象。objects.each{…}
返回对象
(每个
始终返回其接收器),因此,删除response
行将导致返回对象。似乎您需要o.fetch(55,nil)
或o[55]
@engineersmnky:“仍然需要遍历整个枚举”-当它在一个懒惰的枚举器上调用时就不需要了。@engineersmnky:啊,很遗憾您这么快就承认了错误。我甚至准备了一个剧本来证明你错了。我现在该怎么处理它呢?¯\_(ツ)_/“‘你现在正在编写一个脚本来反驳我的评论吗?@CarySwoveland:你假设它是一个散列。很可能是某种类型的api客户端。但是对于散列-是的,这种形式的获取不会太好。请参阅@SimpleTime对我的回答的评论。似乎你需要o.fetch(55,nil)
或o[55]
@engineersmnky:“仍然需要遍历整个枚举”-当它被一个懒惰的枚举器调用时就不需要了。@engineersmnky:啊,很遗憾你这么快就承认了错误。我甚至准备了一个脚本来证明你错了。我现在该怎么处理它呢?“\_(ツ)_/“‘你现在正在编写一个脚本来反驳我的评论吗?@CarySwoveland:你假设它是一个散列。很可能是某种类型的api客户端。但是对于散列-是的,这种形式的获取不会太好。@engineersmnky将返回对象
而不是响应。但是,正如Cary指出的,每个
都返回对象
如果没有找到,但是find返回nil
,这更好。@engineersmnky会返回对象
而不是响应。但是,正如Cary指出的那样,每个都返回对象
,如果没有找到,但是find返回nil
,这更好。安全导航很有趣,为什么不使用e> 我刚刚注意到你的评论。我相信你是在建议(arr.find->{{{}}{{{{}}{{h}{h}[55]{/code>,这是有效的,但我不明白。请解释。对不起,应该是arr.find->{h}{h}{h[55]}{
Enumerable#find
接受在未找到匹配元素的情况下调用的ifnone
可调用对象,因此在本例中,我们只传递一个lambda,该lambda返回一个空的哈希值
对空散列或find块返回的散列执行操作。@engineersmnky,我不知道find带有可选参数(至少从那时起就这样做了)