2013-08-27 2 views
2

Одной из особенностей языка программирования, которую я считаю существенной, является автоматическая печать отсутствующих именных аргументов, поскольку она делает отладку намного проще.Печать имен отсутствующих аргументов функции в Ruby

Однако, я еще не нашел простой способ сделать это в Ruby. Этот пример кода печатает wrong number of arguments (1 for 3) (ArgumentError) вместо печати имен каждого отсутствующего аргумента:

def add_three_numbers(num1, num2, num3) 
    puts(num1 + num2 + num3) 
end  

add_three_numbers(num2:3) 

Я нашел один способ печати недостающих имен аргументов функции, но это очень многословные и избыточный: есть менее многословен способ напечатать имена отсутствующих аргументов функции?

def add_three_numbers(num1=nil, num2=nil, num3=nil) 
    errorToPrint = "" 
    if(num1 == nil) 
     error_to_print += "num1 is undefined, " 
    end 
    if(num2 == nil) 
     error_to_print += "num2 is undefined, " 
    end 
    if(num3 == nil) 
     error_to_print += "num3 is undefined, " 
    end 
    if(error_to_print != "") 
     throw error_to_print 
    end 

    puts(num1 + num2 + num3) 
end 

add_three_numbers(num1:1) 
+1

@AndersonGreen Хотя вы можете написать либо camelCase, либо snake_case, ваш код будет намного более совместим с библиотеками Ruby (включая стандартную библиотеку) и авторами, если вы будете придерживаться snake_case. – Aupajo

+1

Почему имя аргумента важно? Какая реальная проблема здесь? Вероятно, вы получаете downvotes, потому что это кажется довольно глупым (например, «я бы предпочел, чтобы ключевое слово' def' было заглавным - любой способ сделать это? »). – Chuck

+0

@Chuck Не всегда легко запомнить имя каждого параметра для функции, особенно если функция имеет множество параметров. Вот почему мне нужно видеть имена отсутствующих параметров, когда я вызываю функцию с именованными аргументами. –

ответ

0

Краткое описание этой проблемы is given here, поэтому я делюсь ею для всех, кто приходит в будущем.

def add_three_numbers num1 = nil, num2 = nil, num3 = nil 
    undefined = local_variables.select{|var| eval(var.to_s).nil?} - [:undefined] 
    puts "#{undefined.join(", ")} are undefined" unless undefined.empty? 
end 

add_three_numbers 
# => num1, num2, num3 are undefined 

add_three_numbers(1) 
# => num2, num3 are undefined 

Ответ был удален оригинальным плакатом, но с тех пор он был восстановлен.

0

Хотя я согласен, что это действительно делает вещи яснее, стоит отметить, что причина Руби не делает это, вероятно, потому что это было бы очень трудно, возможно, чрезмерно трудно, чтобы получить право.

Если проблема проста, это потому, что пример прост. Представленное решение sawa может работать как рекламируемое, но я могу подумать о способах определения методов, для которых это не сработает.

Это немного похоже на то, что вы сражаетесь со структурой языка, чтобы восстановить то, к чему вы привыкли, что естественно, когда вы пытаетесь использовать новый язык. Я бы посоветовал вам отпустить это на мгновение, просто пойти с потоком и вернуться к этому позже, как только вы подберете немного больше Руби.

У Ruby есть отличные инструменты для отладки и документирования, которые упрощают поиск отсутствующих аргументов аргументов метода. Отъезд ri, RDoc, and gem server, все из которых поставляются с Ruby. Если вы хотите что-то более глубокое, я также могу рекомендовать debugger.

+0

@AndersonGreen. Его решение заключалось в использовании 'local_variables', о котором вы можете узнать больше в [стандартной библиотеке] (http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-local_variables). Он просто возвращает список локальных переменных, некоторые из которых могут быть именами аргументов. Затем вы можете использовать 'eval' или один из своих друзей, чтобы найти значение. Я бы посоветовал вам играть с ним, но не использовать его в какой-либо производственной среде. – Aupajo

0

Невозможно сделать это, если вы не хотите взломать Ruby и скомпилировать свою собственную версию.

Если ваша проблема заключается в том, чтобы помнить, какие параметры имеют методы, большинство основных редакторов программного обеспечения имеют некоторую функциональность «перейти к определению». Например, я использую Sublime Text. Если мне нужно помнить, какие параметры метода есть, я просто нажимаю command-option-down и показывает мне определение метода.

+0

Собственно, есть способ сделать это, но ответ, объясняющий, как это сделать, был удален его плакатом ([по причинам, описанным здесь] (http://meta.stackexchange.com/questions/194888/why- это-The-замедлитель пытается к скрытию-фактум)). Я надеюсь, что ответ будет окончательно отменен, так как теперь я не могу получить к нему доступ. –

+1

@AndersonGreen: Это все еще требует, чтобы вы придерживались его в каждом отдельном методе, и, к сожалению, он не работает в общем случае, поскольку он не может отличить проходящий ноль и забыть передать аргумент. – Chuck

Смежные вопросы