我写了大写(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
答案 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
capitalized(word)
返回false
时就会发生这种情况:因此条件if !capitalized(word)
实际上是if !false
,等于if true
。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
希望对您有帮助!