我正试图解析一组json属性,并将它们分配给一个散列。json有很多层次:
player[:position]=player["positions"]["primary_position"]["position"]["name"]我遇到的问题是,这些级别中的任何一个都可能为零,这意味着我需要编写四个单独的零?检查只是为了提取值。
我不关心nil值--如果数组只是将它们记录为" "或类似的东西,那就好了。
有什么方法可以关闭这种特殊类型的nil错误吗?还是应该通过一个rescue方法运行整个过程,该方法在发生nil时返回我想要的值
发布于 2014-03-17 16:44:42
player[:position]=player["positions"]["primary_position"]["position"]["name"] rescue " "这将返回所需的值,如果某物为零,则返回“”。
发布于 2014-03-17 16:45:21
您可以使用和 gem,它类似于也许是单曲。
player[:position] = player.andand["positions"].andand["primary_position"].andand["position"].andand["name"]这是一个被保护的方法调用。只有当结果不是nil时,它才会继续向对象发送方法,否则会返回nil。这样,链式调用在其中一个返回nil时就停止了。
发布于 2014-03-17 17:26:32
通常的方法是这样使用inject:
path = %w[positions primary_position position name]
value = path.inject(player) { |h, k| h && h[k] }您将调整h && h[k]测试以满足您的特定需求,假设您不必担心h中的非Hash值。你把它做得像你需要的那样精细。
如果您一直在做这样的事情,甚至可以将其修补到Hash中:
class Hash
def follow_path(*path)
# You could also path.flatten if you're not expecting Array keys
path.inject(self) { |h, k| h && h[k] }
end
end
value = person.follow_path(*%w[positions primary_position position name])或者将其抛到私有实用程序方法中:
private
def follow_path(h, *path)
# Assuming you're not using Array keys...
path.flatten.inject(h) { |h, k| h && h[k] }
end然后:
value = follow_path(person, %w[positions primary_position position name])https://stackoverflow.com/questions/22460181
复制相似问题