Это не имеет ничего общего с кортежами. Во всяком случае, невозможно преобразовать из массива в кортеж в общем случае, поскольку массивы могут иметь любую длину, а arty кортежа необходимо знать во время компиляции.
Однако, вы можете решить свою проблему, предоставив перегрузки:
// This function does the actual work
func sumOf(_ numbers: [Int]) -> Int {
return numbers.reduce(0, +) // functional style with reduce
}
// This overload allows the variadic notation and
// forwards its args to the function above
func sumOf(_ numbers: Int...) -> Int {
return sumOf(numbers)
}
sumOf(2, 5, 1)
func averageOf(_ numbers: Int...) -> Int {
// This calls the first function directly
return sumOf(numbers) / numbers.count
}
averageOf(2, 5, 1)
Возможно, есть лучший способ (например, Scala использует специальный тип, чтобы избежать необходимости перегрузки, вы можете писать в Scala sumOf(numbers: _*)
изнутри averageOf
без определения двух функций), но я не нашел его в документах.
Чтобы войти через HTTParty, вам нужно искать больше вещей, чем куки. Вы также должны увидеть CSRF_token. Я думаю, что вы можете получить authenticity_token с помощью метода gsub, но я попытался, и было довольно сложно создать регулярное выражение. Поэтому я использовал Нокогири для получения токена, который на самом деле присутствует в знаке в форме. Ниже приведены подробности, и в конце я приведу весь код.
Добавляя необходимые Gems, вы можете добавить их в Gemfile
gem 'httparty'
gem 'nokogiri'
Запустить bundle install
, чтобы установить Gem.
Чтобы получить CSRF_token, мы должны получить страницу sign_in.
url = "http://localhost:3000/users/sign_in"
get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]
Таким образом, мы получили auth_token, который был в форме как скрытое поле. Теперь давайте получим куки, так как сеансовые куки могут понадобиться.
cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }
Здесь мы получаем куки, где также присутствует сессия. Теперь пришло время получить окончательные параметры, и мы отправим файлы cookie и сеанс для входа в систему
params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@email.com",·
"user[password]"=>"password"}
params["commit"] = "Login"
Теперь параметры готовы, вы можете использовать следующий запрос httparty для входа и получения файлов cookie.
response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )
Теперь для другого запроса вы можете запустить тот же метод куки-файлов, чтобы вернуть все куки-файлы
cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }
И для доступа к другим страницам вы можете отправить запрос с куки-файлами, как мы это делали в предыдущем примере. Помните, что если вы снова собираетесь использовать какую-либо страницу, имеющую форму, вам снова нужно получить ее csrf.
response = HTTParty.post("http://localhost:3000/users/other_urls", {headers: {'Cookie' => cookie_hash.to_cookie_string }} )
Я попробовал этот код, и он работает отлично. Вот полный код для вашего использования
require 'httparty'
require 'Nokogiri'
require 'Pry'
url = "http://localhost:3000/users/sign_in"
get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]
cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }
params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@example.com",·
"user[password]"=>"password"}
params["commit"] = "Login"
response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )
puts response