ha sh .key (my_key) не имеет доступа к ключам во вложенных ha sh в ruby - PullRequest
0 голосов
/ 05 августа 2020

1- У меня небольшой опыт работы с ruby, и я исхожу из C / Python.

2- В следующем фрагменте:

CSV.foreach(filename, quote_char: '"', col_sep: "\t") do |row|
    if header_seen == true
        k = row[primer]
        c = row[counts].to_i
        p = row[prfreq].to_f
        e = row[err].to_f

        print k," ",table.keys," ",table,"\n"

        if table.key(k) == true
            table[k]['counts'] << c
            table[k]['err'] << e
            table[k]['prfreq'] << p
        else
            puts "WHY IT IS ALWAYS GETTING HERE???"
            table[k] = {'counts'=>[c], 
                        'err'=>[e],
                        'prfreq' => [p]
                    }
        end

    elsif header_seen == false and row[0] == "BARCODE"
        counts  = row.index('PRCOUNT')
        primer = row.index('PRIMER')
        prfreq = row.index('PRFREQ')
        err = row.index('ERROR')
        header_seen = true
    end 
end

Printing table.keys (строка 8), я вижу ключи. Однако if table.key(k) == true никогда не сбывается.

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 06 августа 2020

Предполагая, что table - это Ha sh (что мы не знаем наверняка из вашего кода), table.key(k) возвращает значение для ключа k, если ключ существует в вашем ha sh или nil, если его нет. Поскольку значения вашего Ha sh кажутся не логическими значениями, сравнение с true всегда будет ложным.

Если вы просто хотите проверить, существует ли ключ, используйте метод key? вместо key:

if table.key?(k)
   ...
end

(в этом случае можно было бы провести явное сравнение с true, но оно является избыточным, поэтому я исключил его).

Если ваш Ha sh был создан для использования стандартного значения по умолчанию (например, nil), вы можете сократить его до

if table[k]
    ...
end

Основное различие между table.key(k) и table[k] заключается в том, что если k отсутствует в Ha sh, первый всегда возвращает nil, а последний возвращает значение по умолчанию для этого конкретного Ha sh, которое вы указали в конструкторе.

См. здесь подробнее.

2 голосов
/ 05 августа 2020

Вместо table.key(k)

должно быть table.key?(k)
1 голос
/ 05 августа 2020

Это то, что вы ищете, извините, я не знаю, что такое k, и предполагаю, что это означает ключ. Учитывая это ha sh:

hash = { a: "b" }

, ключевой метод, вызываемый на ha sh, ищет значение, а не ключ:

hash.key("b")
 => :a

поэтому, если вы хотите найти значение по ключу:

hash[:a]
 => "b"

В любом случае метод никогда не вернет true, поскольку он не является логическим, поэтому просто выполните:

hash.has_key?(:a)
 => true 
...