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#[]
ожидает получить целое число в качестве аргумента, и вы передаете символ.