什么是`if acct.activity [year]&& acct.activity [年] [月]`是什么意思?

时间:2015-07-23 08:46:25

标签: ruby haml

我正在尝试理解由不在场的人编写的一行代码:

- if acct.activity[year] && acct.activity[year][month]

它用于以下环境:

    %tbody
  - x = (@today.year == year) ? @today.month : 12
  - x.downto(1) do |month|
    %tr
      - if month == x
        %td{rowspan: x}= year
      %td= Date::MONTHNAMES[month]
      - @customer.accounts.each do |acct|
        - if acct.activity[year] && acct.activity[year][month]
          %td{'data-transactions' => acct.activity[year][month]}
            - stmt = acct.statement(year, month)
            = link_to 'View', url(:statements, :show, id: stmt.to_s)
            = link_to image_tag('/icons/document-pdf.png', alt: 'Download PDF'), url(:statements, :show, id: stmt, format: :pdf), class: :pdf
        - else
          %td

此代码的目的是按月和年显示财务报表。奇怪的是我可以在我的控制台中输出数据并采用这种形式;

{10=>1}
1
{3=>2}
2
{6=>1}
1
{6=>1, 9=>1}
1
{7=>2}
2
{3=>1}
1
{2=>1}
1
{2=>1, 4=>1}
1
{2=>1, 4=>1, 8=>2}
2
{4=>1}
1
{4=>1, 5=>1}
1
{4=>1, 5=>1, 6=>1}
1
{4=>1, 5=>1, 6=>1, 7=>14}
14

它存在但由于某种原因它没有被退回。我们在使用db调用存储过程时工作了,但是我们正在改变项目以使用API​​和HTTP调用,从那时起它就不起作用了。这是声明它和puts在控制台中生成上述内容的地方:

@activity = {}
@activity = response['AccountActivity'].map do |row|
  @activity[row['year']] = {} unless @activity[row['year']]
  @activity[row['year']][row['month']] = row['transactions']
  puts @activity[row['year']]
  puts @activity[row['year']][row['month']]
end

2 个答案:

答案 0 :(得分:1)

看起来acct.activity会返回哈希值。如果您刚刚执行了acct.activity[year][month],并且acct.activity[year]为零,则您将执行nil[month],这会导致错误。

&&logical and因此,如果acct.activity[year]为零,则整个测试将返回nil,而不是错误。因此,当您不确定散列中的内容时,它是一种简单的安全机制。

答案 1 :(得分:0)

鉴于acct.activity()返回嵌套的'哈希',它通常用于检查返回的hash是否包含预期的条目。

a = { :a => {}, :b => { :c => 2 } }

a[:a] && a[:a][:x] ? true : false
# => false
a[:b] && a[:b][:c] ? true : false
# => true