Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:如何从Ruby每个方法返回单值_Ruby - Fatal编程技术网

Ruby:如何从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了。

下面的代码在方法末尾返回哈希值。我要做的是返回相同的响应,而不在方法的开头声明response={}。如何在ruby中实现这一点

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带有可选参数(至少从那时起就这样做了)