#ruby
#ruby
Вопрос:
У меня есть строка и массив с некоторыми строками. как показано ниже
hostname = TETDC3DBE01
Array = ['WEB','APP','STR','DBE']
Я хочу выяснить, совпадает ли это имя хоста с каким-либо элементом массива или нет?
Когда я пытаюсь с помощью приведенного ниже кода получить вывод
no
no
no
no
Здесь цикл повторяет каждый элемент в массиве. Я хочу проверить это имя хоста с помощью одной проверки в массиве, чтобы выдать вывод только «да» или «нет».
Array.each do |x|
if hostname.match(x)
puts "yes"
else
puts "no"
end
end
Комментарии:
1. Во-первых, вы не должны переопределять Array.
'TETDC3DBE01'.match('WEB') # nil 'TETDC3DBE01'.match('APP') # nil 'TETDC3DBE01'.match('STR') # nil
все nil, поэтому они не совпадают, что вы на самом деле пытаетесь сделать?2. Теперь я хочу выводить только «да»
3. Не
hostname.match(x)
работает?4. Попробуйте
['WEB','APP','STR','DBE'].map { |s| hostname.match?(/#{s}/) ? 'yes' : 'no' } #=> ["no", "no", "no", "yes"]
. Вы хотитеhostname = 'TETDC3DBE01'
(т. Е. в одинарных или двойных кавычках). Лучше отредактируйте это сейчас, прежде чем это привлечет отрицательные голоса..5. Я выхожу как «нет, нет, нет, да», я хочу только «да» или «нет
Ответ №1:
Учитывая этот исправленный код Ruby:
hostname = 'TETDC3DBE01'
array = ['WEB','APP','STR','DBE']
Где, если вы хотите найти все элементы в array
, которые совпадают в качестве подстроки hostname
, ваш код должен работать. Более минимальная система сопоставления, вероятно,:
array.select { |x| hostname.match(x) }
# => ["DBE"]
Использование такого инструмента, как puts
для получения выходных данных, не всегда очень полезно, потому что текст «да» или «нет» не может быть обработан дополнительным кодом. Попробуйте представить программы Ruby как цепочку преобразований, где выбираются все совпадения, а позже вы можете распечатать их, вот так:
puts array.select { |x| hostname.match(x) }.join(',')
# => DBE
Ответ №2:
Проверьте Array#any? метод.
Он передает каждый элемент коллекции в данный блок. Метод возвращает значение true, если блок когда-либо возвращает значение, отличное от false или nil. Если блок не задан, Ruby добавляет неявный блок, { |obj| obj }
который заставит any?
возвращать значение true, если хотя бы один из элементов коллекции не равен false или nil.
Если вместо этого предоставляется шаблон, метод возвращает значение pattern === element
для любого элемента коллекции.
В вашем случае:
hostname = 'TETDC3DBE01'
['WEB','APP','STR','DBE'].any? do |x|
hostname.match(x)
end
или даже если вы на самом деле подразумеваете равный под совпадением:
hostname = 'TETDC3DBE01'
['WEB','APP','STR','DBE'].any?(hostname)
Ответ №3:
Давайте возьмем ваш код, чтобы исправить это.
hostname = "TETDC3DBE01"
arr = ['WEB','APP','STR','DBE']
arr.each do |x|
if hostname.match?(x)
puts "yes"
else
puts "no"
end
end
match
выдает массив результата и
match?
выдает значение true или false
Ответ №4:
Я бы не стал использовать regexp в этом случае. Простой String#include?
, вероятно, быстрее. Кроме того, any?
вернет true
, соответствует ли какой-либо из элементов в лидах массива.
hostname = 'TETDC3DBE01'
array = ['WEB','APP','STR','DBE']
array.any? { |x| hostname.include?(x) }
#=> true
Ответ №5:
Регулярное выражение стало очень простым:
hostname = "TETDC3DBE01"
array = ['WEB','APP','STR','DBE']
re = Regexp.union(array)
hostname.match?(re) # => true