首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环OpenStruct键/值对

如何循环OpenStruct键/值对
EN

Stack Overflow用户
提问于 2020-05-08 00:50:57
回答 2查看 526关注 0票数 0

我有以下OpenStruct数据结构,我正在尝试获取键/值对

代码语言:javascript
复制
> #<OpenStruct conditions=[#<OpenStruct field="Out_of_country", operator="us", values=["true"]>, #<OpenStruct field="Status__c",
> operator="jp", values=["'Approved'"]>, #<OpenStruct field="Status__c",
> operator="gb", values=["'Rejected'"]>], conjunction="and">

Ruby代码:

代码语言:javascript
复制
dataResult = nil
dataResult = data['condition'].include?('out_of_country']

这就是从OpenStruct中提取键/值对的方式吗?

更新:

您说得对,我使用的是to_s,我删除了它,下面是我试图访问的键/值

代码语言:javascript
复制
myresult = data['mainCondtion']
p myresult --> I got this result:

  > #<OpenStruct conditions=[#<OpenStruct field="Out_of_country", operator="us", values=["true"]>, #<OpenStruct field="Status__c",
    > operator="jp", values=["'Approved'"]>, #<OpenStruct field="Status__c",
    > operator="gb", values=["'Rejected'"]>], conjunction="and">

然后我尝试访问fieldvalues

代码语言:javascript
复制
myresult.each_pair{ |key, value| puts "#{key}: #{value}" }

我得到了这个错误:

未定义#的方法"each_pair“

EN

回答 2

Stack Overflow用户

发布于 2020-05-08 01:01:37

您正在尝试循环遍历一个哈希数组。

请参阅SO - How do I iterate over an array of hashes and return the values in a single string?上的此示例答案

@max不喜欢我没有发表长篇的解释,所以我将在上面的答案上进行扩展。

代码语言:javascript
复制
irb(main):029:0> o = OpenStruct.new(foo: "bar", bar: "foo")
=> #<OpenStruct foo="bar", bar="foo">
irb(main):032:0> h = Hash.new
=> {}
irb(main):033:0> h[:foo] = "bar"
=> "bar"
irb(main):034:0> h[:bar] = "foo"
=> "foo"
irb(main):035:0> o
=> #<OpenStruct foo="bar", bar="foo">
irb(main):036:0> h
=> {:foo=>"bar", :bar=>"foo"}
irb(main):037:0> o.respond_to?(:each_pair)
=> true
irb(main):038:0> h.respond_to?(:each_pair)
=> true

OpenStructs和哈希都响应@max推荐的方法-在您描述的情况下,使它们在功能上没有什么不同。

代码语言:javascript
复制
irb(main):040:0> one = OpenStruct.new(field: "Out_of_country", operator: "us", values: ["true"])
=> #<OpenStruct field="Out_of_country", operator="us", values=["true"]>
irb(main):041:0> two = OpenStruct.new(field: "Out_of_country", operator: "jp", values: ["true"])
=> #<OpenStruct field="Out_of_country", operator="jp", values=["true"]>
irb(main):042:0> OpenStruct.new(conditions: [one, two])
=> #<OpenStruct conditions=[#<OpenStruct field="Out_of_country", operator="us", values=["true"]>, #<OpenStruct field="Out_of_country", operator="jp", values=["true"]>]>
irb(main):043:0> c = _
=> #<OpenStruct conditions=[#<OpenStruct field="Out_of_country", operator="us", values=["true"]>, #<OpenStruct field="Out_of_country", operator="jp", values=["true"]>]>
irb(main):044:0> hash_one = {field: "Out_of_country", operator: "us", values: ["true"]}
=> {:field=>"Out_of_country", :operator=>"us", :values=>["true"]}
irb(main):045:0> hash_two = {field: "Out_of_country", operator: "jp", values: ["true"]}
=> {:field=>"Out_of_country", :operator=>"jp", :values=>["true"]}
irb(main):046:0> hash_conditions = [hash_one, hash_two]
=> [{:field=>"Out_of_country", :operator=>"us", :values=>["true"]}, {:field=>"Out_of_country", :operator=>"jp", :values=>["true"]}]

irb(main):052:0> hash_conditions.each { |e| puts e[:operator] }
us
jp
=> [{:field=>"Out_of_country", :operator=>"us", :values=>["true"]}, {:field=>"Out_of_country", :operator=>"jp", :values=>["true"]}]
irb(main):053:0> c.conditions.each { |e| puts e[:operator] }
us
jp
=> [#<OpenStruct field="Out_of_country", operator="us", values=["true"]>, #<OpenStruct field="Out_of_country", operator="jp", values=["true"]>]

没有功能上的区别。

票数 0
EN

Stack Overflow用户

发布于 2020-05-08 01:22:56

如果您只是希望获取OpenStruct的单个属性,则只需在其上调用getter方法:

代码语言:javascript
复制
country = OpenStruct(name: 'Japan', alpha_2: "jp", alpha_3: "jpn")
puts country.name # japan
puts country.alpha_3 # jpn

这就是OpenStruct的全部意义所在。你得到了一个对象,它的行为就像一个类的实例,而实际上没有一个类,也不需要像普通的Struct那样提前定义属性。

您可以使用OpenStruct#each_pair遍历其属性,就像使用散列一样:

代码语言:javascript
复制
os = OpenStruct.new a: 1, b: 2, c: 3
os.each_pair{ |key, value| puts "#{key}: #{value}" }
# Outputs:
# a: 1
# b: 2
# c: 3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61663338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档