不了解我的方法的布尔逻辑

时间:2019-03-15 12:12:39

标签: ruby

我写了大写(word)方法,以将其集中到.each函数中。 我用爆炸!使功能正常工作,但我不明白为什么它正常工作。 真正让我失望的部分是!大写的单词行if语句。我不了解逻辑以及该方法如何返回它所做的答案。 !false在方法中返回false ...为什么? !true会返回true。 什么是理解此概念的最佳方法。

我尝试取出爆炸,然后放回去以查看其效果。 这让我感到困惑。谢谢您的帮助。

# 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 :(得分:0)

  

!false在方法中返回false ...为什么?

我假设你是这个意思:

if !capitalized(word)
  return false
end

“如果capitalize返回false,为什么我们返回false”,这个问题?因为如果单词不大写,则名称无效。这就是给定的业务逻辑。

答案 1 :(得分:0)

您苦苦挣扎的代码部分的目的是检查名称的所有元素是否都大写。有两种方法可以解决该问题:

查找任何未大写的元素。

如果存在这样的元素,则意味着名称无效,因此方法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. 我们输入的内容表示我们的单词无效,因此我们从is_valid_name方法返回false。

检查所有元素是否都大写

这是更直接的解决方案。我们只想检查方法capitalized(word)是否对名称的所有元素返回true。

要实现这一点,我们可以使用方法all?,如果块中的条件对于每个元素都返回true,则该方法返回true;否则,该方法将返回true。否则为假。因此,我们可以将以上所有代码替换为一行:

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

验证方法的最终实现如下所示:

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

希望对您有帮助!