создать разделенную запятыми строку в первом элементе массива Ruby - PullRequest
0 голосов
/ 19 сентября 2019

Так что это может показаться странным, и я немного погуглил, однако на самом деле я не программист (сисопы) и пытаюсь выяснить, как передавать данные в API AWS в требуемом формате, которыйкажется немного странным

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

{env => ["stage,qa,dev"]} 

, а не

{env => ["stage","qa","dev"]}

Я создан по общему признанию.не очень симпатичное маленькое приложение, которое позволит мне запускать ssm-документы в целевых экземплярах в aws.

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

class Tags

  attr_accessor :tags

  def initialize
    @tags    = {"env" => nil ,"os" => nil ,"group" => nil }
  end

  def set_values()
    puts "please enter value/s for the following keys, using spaces or commas for multiple values"
    @tags.each { |key,value|
    print "enter #{key} value/s: "
    @tags[key] = [gets.strip.chomp]
    @tags[key] = Validate.multi_value(tags[key])
    }
  end

end

Затем я вызываю этот Validate.multi_value, передавая созданный массив, но он выплевывает массив моей строкизначение обратно.

class Validate
  def self.multi_value(value)
      if value.any?{ |sub_string| sub_string.include?(",") || sub_string.include?(" ") }
         value = value[0].split(/[,\s]+/)
       return value
      else
       return value
     end

    end

end

Используя pry, я видел, что он получает, например, ["stage dev qa"], затем оператор if работает, затем выплевывает ["stage","dev","qa"].

, и мне нужно вывести его["stage,dev,qa"] но ради жизни я не могу заставить это работать.

Надеюсь, это понятно.

Если у вас есть какие-либо предложения, я был бы очень признателен.

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

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Если ваши массивы всегда отображаются в формате ["stage dev qa"], то сначала нам нужно разбить одну строку на нужные нам части:

arr = ["stage dev qa"]
arr.split(' ')
=> ["stage", "dev", "qa"]

Затем нам нужно объединить их запятой:

arr.split(' ').join(',')
=> "stage,dev,qa"

И, наконец, нам нужно обернуть его в массив:

[arr.first.split(' ').join(',')]
=> ["stage,dev,qa"]

Все вместе:

def transform_array(arr)
  [arr.first.split(' ').join(',')]
end

transform_array(['stage dev qa'])
=> ['stage,dev,qa']

Дополнительная информация: Как мнепреобразовать массив строк в строку через запятую?

0 голосов
/ 19 сентября 2019

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

def set_values
  ["env", "os", "group"].map do |tag|
    puts "Please enter values for #{tag}, using spaces or commas"
    print "to separate multiple values: "
    gets.strip.gsub(/[ ,]+/, ',')
  end
end

Предположим, когда пользователь спрашивает, "stage dev,qa" (for "env" ), "OS X" (for "OS" ) and "Hell's Angels" для "group".Тогда:

set_values
  #=> ["stage,dev,qa", "OS,X", "Hell's,Angels"]

Если, как я подозреваю, вы хотите преобразовать пробелы в запятые только для "env", а не для "os" или "group", напишите:

def set_values 
  puts "Please enter values for env, using spaces or commas"
  print "to separate multiple values: "
   [gets.strip.gsub(/[ ,]+/, ',')] +
   ["os", "group"].map do |tag|
     print "Please enter value for #{tag}: "
     gets.strip
   end
end

set_values
  #=> ["stage,dev,ga", "OS X", "Hell's Angels"] 

См. Array # map , String # gsub и Array # + .

gets.strip.gsub(/[ ,]+/, ',') просто цепочки две операции s = gets.strip и s.gsub(/[ ,]+/, ',').Цепочка - это обычное явление в Ruby.

Регулярное выражение, используемое gsub, гласит: «соответствовать одному или нескольким пробелам или запятым», [ ,] - класс символов , для которого требуется один изсимволы в классе должны совпадать, + означает, что одно или несколько из этих пробелов или запятых должны совпадать.Если бы строка была "a , b,, c", было бы два совпадения, " , " и ",, ";gsub преобразует оба в одну запятую.

Использование print вместо puts отображает запись пользователя в той же строке, что и приглашение, сразу после ": ", а не в следующей строке.,Это, конечно, чисто стилистически.

Часто можно написать gets.chomp вместо gets.strip.Удаляя символы новой строки и другие пробелы в конце строки, strip также удаляет все пробелы в начале строки.strip, вероятно, лучше в этом случае.

0 голосов
/ 19 сентября 2019

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

"this    string,, has too  many,,, , spaces"

станет

"this,string,has,too,many,spaces"

, а не

"this,,,,string,,,has,too,,many,,,,,,spaces"

Вот код

class Tags
  attr_accessor :tags

  # initializes the class (no change)
  #
  def initialize
    @tags = {"env" => nil ,"os" => nil ,"group" => nil }
  end

  # request and assign the values <- SOME CHANGES
  #
  def set_values
    puts "please enter value/s for the following keys, using spaces or commas for multiple values"
    @tags.each do |key,value|
      print "enter #{key} value/s: "
      @tags[key] = Validate.multi_value( gets )
    end
  end
end

class Validate
  # Sets the array
  #
  def self.multi_value(value)
    # Remove leading spaces, then remove special chars,
    # replace all spaces with commas, then remove repetitions
    #
    [ value.strip.delete("\n","\r","\t","\rn").gsub(" ", ",").squeeze(",") ]
  end
end

РЕДАКТИРОВАНИЕ, спасибо lacostenycoder

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