Как использовать include? метод в ruby - PullRequest
1 голос
/ 05 мая 2020
vowels = "aeiou"
"hello".include?(vowels) # ==> false

но если я добавлю ! в оператор, он будет работать нормально:

!("hello".include?(vowels) # ==> true

Ответы [ 4 ]

1 голос
/ 05 мая 2020

Evolve уже объяснил в своем ответе, почему ваша версия с include? не работает.

Метод проверки того, содержит ли строка хотя бы один вокал, может выглядеть так в Ruby:

"hello".match?(/[aeiou]/i)
#=> true
"hxllx".match?(/[aeiou]/i)
#=> false

match? принимает регулярное выражение и возвращает true, если строка соответствует шаблону. /[aeiou]/i - это регулярное выражение, которое соответствует, когда любой из ([...]) символов в списке aeiou найден в строке хотя бы один раз. i в конце делает все выражение без учета регистра.

1 голос
/ 05 мая 2020

.include? оценивает предоставленную строку как целое слово, поэтому ваш метод говорит следующее: «включает ли« привет »все вложенное слово « aieou »как его часть». Вот почему в первую очередь оно ложно, так как ваша строка «hello» не включает слово «aeiou».

Попробуйте это, и вы получите true:

vowels = "llo"
"hello".include?(vowels) # ==> true

Во-вторых, вы неправильно понимаете, что делает bang («!»). Это не заставляет ваш метод работать, все, что он делает, - это обратный результат, поэтому, когда добавлен удар, любой истинный оператор становится ложным, а любой ложный оператор, когда добавляется удар, становится истинным.

Попробуйте следующее:

> true
> !true
> false
> !false

Вы можете убедиться в этом сами с помощью этого кода:

vowels = "llo"
!"hello".include?(vowels) # ==> false

Хорошее место для игры с небольшими вопросами Ruby logi c - это IRB или проекты Rails с rails console, который расширяет IRB. Просто запустите irb с терминала, чтобы вызвать подсказку Ruby, вы, вероятно, знали об этом, я просто делюсь им, если это поможет.

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

Вывод состоит в том, что когда есть набор вещей до go, вы обычно захотите пройти они используют each, оценивая по одному.

vowels = "aeiou"
result = false
vowels.each_char do |char| 
  result = true if "hello".include?(char) 
end
puts result

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

0 голосов
/ 05 мая 2020

Как уже сказал @Evolve, x.include?(y) проверяет, является ли y подстрокой x. Вы хотите знать, включает ли x ('hello') хотя бы один символ из y ('гласные'). Это можно сделать по x.split(//).any? {|c| y.include?(c)}. split(//) превращает строку в массив символов, а any? проверяет, соответствует ли хотя бы один элемент массива свойству, указанному в блоке кода.

0 голосов
/ 05 мая 2020

Я использую это, чтобы объяснить, как работает ! (not):

true    # => true
false   # => false

!true   # => false
!false  # => true

!!true  # => true
!!false # => false

Помните, что в Ruby, nil и false ложны, все остальное верно. В других языках 0 также может считаться ложным, и это может сбить с толку людей, которые только учатся Ruby:

foo = nil   # => nil
bar = 0     # => 0
baz = 1     # => 1

!foo = nil  # => true
!bar = 0    # => false
!baz = 1    # => false

!!foo = nil # => false
!!bar = 0   # => true
!!baz = 1   # => true

А not - это длинная форма !:

!true     # => false
not true  # => false
!false    # => true
not false # => true

Вы часто будете видеть, что !! используется для преобразования значения в его истинный / ложный эквивалент.

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