Не понимая логическую логику моего метода - PullRequest
0 голосов
/ 15 марта 2019

Я пишу метод с заглавной буквы (word) для направления в функцию .each.я использую взрыв!чтобы заставить функцию работать правильно, но я не понимаю, почему она работает правильно.Часть, которая действительно отталкивает меня, - это строка слова!Я не понимаю логику и то, как метод возвращает ответы, которые он делает.! false возвращает false в методе ... почему?И! Правда, это возвращает истину.Какой лучший способ понять эту концепцию.

Я пытался снять удар и положить его обратно, чтобы увидеть его эффект.И это меня просто смущает.Спасибо за помощь.

# A name is valid is if satisfies all of the following:
# - contains at least a first name and last name, separated by spaces
# - each part of the name should be capitalized
#
# Hint: use str.upcase or str.downcase
# "a".upcase # => "A"

def is_valid_name(str)
  name = str.split(' ')

  if name.length < 2
    return false
  end

  name.each do |word|
    if !capitalized(word)
      return false
    end
  end
  return true
end

def capitalized(word)
  if word[0] == word[0].upcase && word[1..-1]== word[1..-1].downcase
    return true
  else
    return false
  end
end



puts is_valid_name("Kush Patel")       # => true
puts is_valid_name("Daniel")           # => false
puts is_valid_name("Robert Downey Jr") # => true
puts is_valid_name("ROBERT DOWNEY JR") # => false

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

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

Найдите любой элемент без заглавной буквы.

Если такой элемент существует, это означает, что имя недопустимо, поэтому метод is_valid_name должен вернуть false. Этот подход используется в вашем коде:

def is_valid_name(str)
  #...
  name.each do |word| #1
    if !capitalized(word) #2
      return false #3 
    end
  end
  return true #4
end
  1. Перебирать каждую часть имени
  2. Проверьте, написано ли слово с большой буквы. Мы хотим разбить только тогда, когда мы найдем недопустимое (не заглавные) слово. Это происходит, когда capitalized(word) возвращает false: таким образом, условие if !capitalized(word) на самом деле if !false, что равно if true.
  3. Мы ввели, это означает, что наше слово недопустимо, поэтому мы возвращаем false из метода is_valid_name.

Проверьте, написаны ли все элементы с заглавной буквы. Это более простое решение. Мы просто хотим проверить, возвращает ли метод capitalized(word) значение true для всех элементов имени.

Для этого мы можем использовать метод all? , который возвращает true, если условие в блоке возвращает true для каждого элемента; иначе ложно. Таким образом, мы можем заменить весь код выше одной строкой:

name.all?{|word| capitalized(word) }

Окончательная реализация метода проверки может выглядеть так:

def is_valid_name(str)
  name = str.split(' ')
  name.length < 2 && name.all?{|word| capitalized(word)}
end

Надеюсь, это поможет вам!

0 голосов
/ 16 марта 2019

!false возвращает false в методе ... почему?

Полагаю, вы имеете в виду это:

if !capitalized(word)
  return false
end

«Если capitalize возвращает false, почему мы возвращаем false», этот вопрос? Потому что, если слово не написано с заглавной буквы, имя недействительно. Это заданная бизнес-логика.

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