'ArgumentError: неверное количество аргументов' в Ruby inspect (та же строка кода, только для некоторых значений) - PullRequest
0 голосов
/ 30 марта 2020

Я столкнулся с этим, когда боролся с этой проблемой - но я думаю, что это скорее запрос на уровне языка Ruby.

У меня есть метод, который принимает четыре параметра:

def render_node_to_output(node, output, context, skip_output = false)

(Для любопытных я говорю о методе Liquid::BlockBody::render_node_to_output из liquid:4.0.3 (на Linux, строка 102 на gems/liquid-4.0.3/lib/liquid/block_body.rb).)

В самом начале метода я проверяю первые три переменные следующим образом:

p node
p output
p context
print("\n\n")

Этот метод неоднократно вызывается различными компонентами, и в некоторые моменты я получаю ошибка:

/root/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/jekyll-3.8.5/lib/jekyll/filters.rb:292:in `inspect': wrong number of arguments (given 0, expected 1) (ArgumentError)
    from /root/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/liquid-4.0.3/lib/liquid/block_body.rb:105:in `inspect'
    from /root/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/liquid-4.0.3/lib/liquid/block_body.rb:105:in `p'
    from /root/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/liquid-4.0.3/lib/liquid/block_body.rb:105:in `render_node_to_output'

Видимо, переменная context в какой-то момент переходит в какое-то "несуществующее" (?) состояние.

Я пытался добавить print(context.class) и print(context) прямо перед p context, и они отображают одинаковые , допустимые значения для сценария как успеха, так и неудачи ios: Liquid::Context и #<Liquid::Context:0x00007fffd43d9948>.

Мои запросы:

  • почему inspect говорит, что не получил аргумент, когда я его явно передал? Что еще более важно, почему это происходит только для некоторых значений context? AFAIK, даже если context были nil, inspect не должен завершиться ошибкой (ruby -e "x = nil; p x" производит nil). Я не смог найти никаких ссылок на то, почему или когда inspect мог бы вести себя таким образом.
  • , как правильно пропустить такие "плохие" состояния context, чтобы я мог, по крайней мере, продолжить проверка «хороших» значений без прерывания программы в первом «плохом» состоянии - в идеале без использования стратегии try-catch?

(я довольно новичок в Ruby, поэтому извиняюсь, если я пропустил / неправильно использовал любой жаргон.)

1 Ответ

1 голос
/ 30 марта 2020

Ошибка _argument говорит: given 0, expected 1 для inspect. Это означает, что inspect, вызываемый здесь, ожидает один аргумент. Но inspect всегда вызывается без аргументов.

Из этого я заключаю, что метод inspect был переопределен для context.class.

ОБНОВЛЕНИЕ:

Теперь, основываясь на комментарии OP к моему ответу, я предлагаю следующую модификацию неисправной программы:

Сначала мы проверяем, что исключение действительно происходит из этого вызова inspect что мы подозреваем; хотя это кажется очевидным, дьявол не спит, и мы хотим go уверен. Если это произойдет, мы подробнее рассмотрим свойства объекта-нарушителя:

Мы заменим p context на

begin
  # Doing an explicit `inspect` to be in control of what is going on
  ic  = context.inspect
  puts ic
rescue ArgumentError => e
  puts "Exception!"
  puts e
  puts "context is a #{context.class}"
  puts "inspect expects: #{context.class.method(:inspect).parameters}"
end

Если это действительно так, как утверждает ОП, что этот код отображает Exception! , но все еще показывает пустой массив параметров, я бы сообщил об этом точном примере на трекер ошибок Ruby.

...