Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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_Arrays - Fatal编程技术网

Ruby:解析条件数组元素的最佳方法

Ruby:解析条件数组元素的最佳方法,ruby,arrays,Ruby,Arrays,我正在进行API调用,该调用将有条件地返回两个不同的元素。我的代码当前为: if array['productId'] value = array['productId'][0] end 我觉得有一种更简洁的方法可以做到这一点。一些红宝石魔法。您可以使用三元: value = array['productId'].nil? ? nil : array['productId'][0] 更好的方法: value = array['productId'][0] if array['pr

我正在进行API调用,该调用将有条件地返回两个不同的元素。我的代码当前为:

if array['productId']
  value = array['productId'][0]
end

我觉得有一种更简洁的方法可以做到这一点。一些红宝石魔法。

您可以使用三元:

   value = array['productId'].nil?  ? nil : array['productId'][0]
更好的方法:

value = array['productId'][0] if array['productId']

但是,数组['productId'][0]不是ruby natural。您的数组由什么组成?

我不确定您是暂时使用value还是以后实际使用value,以及在不满足条件时希望如何处理value。如果要为缺少的密钥返回nil,则

array['productId'].to_a[0]

我可以工作。否则,SpyrosP的答案将是最好的。

您的代码模式看起来不错;可能会稍微短一点

value = (t = x['productId']) && t[0]

这可能有点迂腐,但为了确保它在所有情况下都有效,您不应该选中“not nil”,而是应该检查它是可转位的;大概是这样的:

value = array['productId'][0] if array['productId'].is_a? Array
或者更好:

value = array['productId'][0] if array['productId'].respond_to? '[]'
否则,如果数组['productId']==2,那么代码将失败,而从另一方面来说,考虑到使用的密钥,数组['productId']==2似乎是合理的-我将使用product\u id来代替它。

使用以下的模式:

value = array['productId'].maybe[0]

虽然我更喜欢SpyrosP的单线版本,但我认为您的代码很好,但您有一些可能性:

Rails有,这将允许您执行数组['productId']。请尝试:[],0或数组['productId']。尝试:在,0

有些人喜欢gem,它定义了Objectandand,使用起来像array['productId'].andand[0]


哈,我喜欢这里所有的选择。但由于我没有看到我最常用的,我将再添加一个

value=array['productId']和&array['productId']

我更喜欢.first而不是[0],因为它读起来稍微好一点

这假定您将在数组['productId']中有一个数组,这是执行此操作而不是类型检查的正确方法

否则,此代码与原始代码之间的最大区别在于,如果数组没有任何内容,则会导致为其赋值为nil,而原始代码则会导致未定义值,这可能会导致错误,具体取决于以后的使用方式


希望有帮助

自Ruby 2.3.0以来,最短的路径是Arraydig:


我认为这是一个散列,不是数组。此外,我不确定还有什么比您拥有的更简洁的东西:如果元素存在,则以更具体的方式与它交互。你不会得到比条件更简洁的东西,除非你一遍又一遍地重复这个过程,并从循环中获益。基本上我是在创建一个对象并将其保存到活动记录中。当模型有10多个字段时,感觉没有必要使用10个不同的条件来提取数据。另请参见我对Spyrospit的回复,它是来自易趣API的JSON响应。我读取字符串并使用JSON.parse。我认为Matchu可能是对的,我实际上在处理一个散列。那样的话,我是否完全做错了?实际上,我从JSON中获取了几个关键数据字段,并将它们以产品模型的形式保存到ActiveRecord数据库中。标题、价格、画廊图片等。我非常喜欢提供的解决方案。。。。我讨厌嵌套东西。value=array['productId']。try:[],0注意:try方法是通过ActiveSupport添加到Rails的,在普通Ruby中不起作用:因此Rails有Objecttry-
array.dig('productId', 0)