Лучший способ заполнить хеш Ruby?

Флаг -d в команде curl указывает curl читать данные из имени файла сразу после него и использовать эти данные в качестве тела запроса. curl не распознает веб-URL как допустимый файл. curl не может прочитать этот JSON-файл, поэтому он действует как пустой файл и создает запрос с пустым телом. Запрос, отправленный API, не содержит никакой информации об этом файле JSON.

Речевой API получает запрос с пустым телом и не может ничего с ним сделать. API даже не знает, что вы указали объект Google Cloud в команде curl.

Метод речи: распознавания описан в https://cloud.google.com/speech-to-text/docs/reference/rest/v1p1beta1/speech/recognize . У него нет никакого способа получить необходимые параметры, кроме как из тела запроса. Вы не можете сказать ему, чтобы он читал эти параметры откуда-то еще, например, URL или объект Google Cloud. Вы должны включить их в запрос, поэтому программа, создающая запрос, должна их знать.

9
задан Bruno Antunes 8 May 2009 в 14:17
поделиться

5 ответов

Slight modification to the above, since your example had string keys:

form_params = {}
%w(tid qid pri sec to_u to_d from wl).each{|v| form_params[v] = send(v)} 
9
ответ дан 4 December 2019 в 06:27
поделиться
form_params = { "tid" => tid, "qid" => qid }     

Или вы можете сделать

form_params = Hash["tid", tid, "qid", qid]       #=> {"tid"=>tid, "qid"=>qid}
form_params = Hash["tid" => tid, "qid" => qid]   #=> {"tid"=>tid, "qid"=>qid}
form_params = Hash[tid => tid, qid => qid]       #=> {"tid"=>tid, "qid"=>qid}

(примечание последнее один новый для 1.9, и он делает ваши ключевые символы вместо строк )

{tid: tid, qid: qid}

Ключи и значения встречаются парами, поэтому должно быть четное количество аргументов.

20
ответ дан 4 December 2019 в 06:27
поделиться

Если производительность не важна, это может выглядеть лучше:

form_params = {}
['tid', 'qid', 'pri', 'sec', 'to_u', 'to_d', 'from', 'wl'].each do |v|
  form_params[v] = eval(v)
end

Если эти имена на самом деле являются методами, вы можете заменить eval на более быструю отправку :

form_params[v] = send(v.to_sym)

(обновление) Альтернативный (и более элегантный) способ с использованием inject :

form_params = ['tid', 'qid', 'pri', 'sec', 'to_u', 'to_d', 'from', 'wl'].inject({}) { |h, v| h[v] = send(v); h }
7
ответ дан 4 December 2019 в 06:27
поделиться

Я создал специальный класс под названием MoreOpenStruct , чтобы справиться с недостатком эстетики Hash, и с использованием этого класса ваш пример будет выглядеть так:

form_params = MoreOpenStruct.new
form_params.tid = tid
form_params.qid = qid
form_params.pri = pri
form_params.sec = sec
form_params.to_u = to_u
form_params.to_d = to_d
form_params.from = from
form_params.wl = wl

form_params_hash = form_params._to_hash
  #=> { :tid => tid, :qid => qid, etc }

Если вам нужны строковые литералы вместо символов в качестве ключа к вашему хэшу потребуется еще пара настроек.

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

0
ответ дан 4 December 2019 в 06:27
поделиться

Другой вариант - создать класс на основе Struct для хранения этих значений. Например:

FormParams = Struct.new(:tid, :qid, :pri, :sec, :to_u, :to_d, :from, :wl)

Тогда вы сможете инициализировать экземпляр form_params различными способами:

form_params = FormParams.new(:tid => tid, :qid => qid, # etc ...
form_params = FormParams.new(tid, qid, pri, sec, to_u, to_d, from, wl)
form_params = FormParams.new
form_params.tid = tid
form_params.gid = gid
# etc ...
0
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: