сделать ха sh согласованным, когда некоторые из его ключей являются символами, а другие нет - PullRequest
1 голос
/ 31 января 2020

Я использую этот код для объединения Matchdata с Ha sh:

  params = {
    :url => 'http://myradiowebsite.com/thestation'
  }

  pattern = Regexp.new('^https?://(?:www.)?myradiowebsite.com/(?<station_slug>[^/]+)/?$')
  matchdatas = pattern.match(params[:url])
  #convert named matches in MatchData to Hash
  #https://stackoverflow.com/a/11690565/782013
  datas = Hash[ matchdatas.names.zip( matchdatas.captures ) ]

  params = params.merge(datas)

Но это дает мне смешанные ключи в моих параметрах га sh:

{: url => "http://myradiowebsite.com/thestation", "station_slug" => "thestation"}

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

Я изучаю Ruby, может кто-нибудь объяснить мне, если что-то не так с этим кодом, и как его улучшить?

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 января 2020

Во-первых, обратите внимание, что с

pattern = 
  Regexp.new('^https?://(?:www.)?myradiowebsite.com/(?<station_slug>[^/]+)/?$')
  #=> /^https?:\/\/(?:www.)?myradiowebsite.com\/(?<station_slug>[^\/]+)\/?$/ 

мы получаем

'http://wwwXmyradiowebsiteYcom/thestation'.match?(pattern)
   #=> true

, что означает, что периоды после 'www' и до 'com' необходимо экранировать:

pattern =
  Regexp.new('\Ahttps?://(?:www\.)?myradiowebsite\.com/(?<station_slug>[^/]+)/?\z')
  #=> /\Ahttps?:\/\/(?:www\.)?myradiowebsite\.com\/(?<station_slug>[^\/]+)\/?\z/ 

Я также заменил привязку начала строки (^) на привязку начала строки (\A) и привязку конца строки ($) на якорь конца строки (\z), хотя здесь можно использовать любой из них, поскольку строка состоит из одной строки.

Вам дается две клавиши, которые вы хотите в ха sh вы возвращаете: :url и :station_slug, поэтому для

params = { :url => 'http://myradiowebsite.com/thestation' }

вы можете вычислить

m = params[:url].match(pattern)
  #=> #<MatchData "http://myradiowebsite.com/thestation" station_slug:"thestation"> 

тогда, пока m не nil (как здесь), напишите

{ :url => m[0], :station_slug => m["station_slug"] }
  #=> {:url=>"http://myradiowebsite.com/thestation", :station_slug=>"thestation"}

См. MatchData # [] . m[0] возвращает весь матч; m["station_slug"] возвращает содержимое группы захвата с именем "station_slug".

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

{ :url => m[0], :station_slug => m[1] }
0 голосов
/ 31 января 2020

Вы можете преобразовать ключи datas в символы:

Hash[ matchdatas.names.zip( matchdatas.captures ) ].transform_keys(&:to_sym)

Или определить свои параметры ha sh с помощью строковых ключей:

params = { 'url' => 'http://myradiowebsite.com/thestation' }
...