Ruby - опция в параметре - PullRequest
       1

Ruby - опция в параметре

0 голосов
/ 15 ноября 2018

У меня проблемы с пониманием параметров с помощью ruby.

def most_frequent_kmers(opt={})
   str            = opt[:str]
   min_chunk_size = opt[:min_chunk_size] || 1
   max_chunk_size = opt[:max_chunk_size] || str.length - 1
   min_occurences = opt[:min_occurences] || 1
   results        = {}
   top_scoring    = {}
end
most_frequent_kmers(1)

, который выдает ошибку

 `[]': no implicit conversion of Symbol into Integer (TypeError)

Я не уверен, что делать, чтобы решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

opts означает, что вы можете передать «неограниченное» количество аргументов при вызове функции, но все они должны быть названы, как вы можете видеть в теле метода:

str            = opt[:str]
min_chunk_size = opt[:min_chunk_size] || 1
max_chunk_size = opt[:max_chunk_size] || str.length - 1
min_occurences = opt[:min_occurences] || 1
...

Это присваивает значение параметра str в opt, min_chunk_size и так далее. Но в случае str, это единственное, которое не имеет значения по умолчанию, но даже в этом случае max_chunk_size зависит от этого, когда это значение в качестве аргумента не предоставлено (так как str. длина - 1 задание).

Для использования most_frequent_kmers вам необходимо предоставить объект String в качестве аргумента str (на самом деле я думаю, что это должен быть String, как следует из названия - str). Таким образом, логика внутри может продолжать работать, все остальные локальные переменные в ней имеют значения по умолчанию, если они не предоставлены.

Если вы хотите передать str в качестве аргумента, вы можете просто сделать most_frequent_kmers(str: 'Some String'), если вы этого не сделаете, он вернет NoMethodError, так как opt[:str] будет nil, и " отступление "значение, когда это происходит, попытается вызвать метод length на nil.

И tl; dr; поскольку вы просто передаете Integer в качестве аргумента, Ruby пытается вызвать [] для аргумента opts, вызывая TypeError для попытки неявного преобразования, начиная с Integer#[] ожидает получить целое число в качестве аргумента, и вы передаете символ.

0 голосов
/ 15 ноября 2018

вы должны вместо этого передать most_frequent_kmers такой хеш-код:

# depends on the ruby version you are using
# {str: "hey"} and {:str => "hey"} work also
most_frequent_kmers(str: "hey")  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...