Параметры метода для строки - PullRequest
0 голосов
/ 06 октября 2011

1) У меня есть метод

def self.createobj(api_key, amnt, commentstr, orderid, order_creation_date, orderfullfilmentdate)  
.....
end

2) Я хочу создать error_str всех параметров, передаваемых в эту функцию ...

2.1) Что-то вроде

errorstr = "api_key: " + api_key.to_s + " amnt: " + amnt.to_s + " commentstr: " + commentstr.to_s + " orderid: " + orderid.to_s + " order_creation_date: " + order_creation_date.to_s + " orderfullfilmentdate: " + orderfullfilmentdate.to_s

2.2) Итак, я создал другой метод

def self.get_params_str(a)
    str = ""
    a.each do |a|
      str = str + a.to_s
    end
    return str
end  

2.3) Поэтому я вызываю этот новый метод из createobj.Что-то вроде

def self.createobj(api_key, amnt, commentstr, orderid, order_creation_date, orderfullfilmentdate)  
errorstr = get_params_str(args)
.....
end

3) Но я получаю сообщение об ошибке неопределенной локальной переменной или метода `args 'для #.Разве аргументы не должны иметь все параметры?

Пожалуйста, совет.

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

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

Метод может иметь дополнительные аргументы:

def my_method(*args)
  ....
  # the array args will have 0 or more elements, depending on how many
  # were in the method invocation.
end

Но если у метода есть определенные (обязательные) аргументы, как в вашем примере, то другого способа получить их нет.

Добавлено Если вы хотите изменить определение вашего метода для использования обходного пути для именованных аргументов, тогда аргументы поступят в виде ассоциативного массива, и вы можете затем отправить их на ваш get_params_string

Или, лучше, переопределите ваш get_params_string, чтобы получить список переменных arg

def self.get_params_str(*a)
  str = ""
  a.each do |a|
    str = str + a.to_s
  end
  return str
end  

# Then call it from your main method:
def self.createobj(api_key, amnt, commentstr, orderid, 
                   order_creation_date, orderfullfilmentdate)  
  errorstr = get_params_str(api_key, amnt, commentstr, orderid, 
                   order_creation_date, orderfullfilmentdate)
  .....
end

См. Полезную запись

1 голос
/ 07 октября 2011

Как указано в других ответах, нет доступной переменной, такой как args, которая предоставляет имена аргументов для метода, однако, если вы используете Ruby 1.9.2 (я не могу подтвердить, существует ли в 1.9.1а также) у вас есть метод parameters, поэтому вы можете сделать что-то вроде этого:

def foo(a, b, c)
    errorstr = method(:foo).parameters.map{|p| "#{p.last}: #{eval p.last.to_s}" }.join(', ')
    puts errorstr
end

foo(1, 2, 3) #=> a: 1, b: 2, c: 3
1 голос
/ 06 октября 2011

args будет содержать параметры только в том случае, если определение вашего метода будет что-то вроде def self.createobj(*args). Без этого args не определено.

Вам нужно будет вручную передать все параметры в get_params_str. Вам нужно будет передать их как массив, т.е. get_params_str([api_key, amnt, commentstr, ...]), если только вы не измените сигнатуру метода get_params_str на def self.get_params_str(*a) (которая помещает все параметры, переданные в get_params_str, в один массив`).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...