我正在课程中进行以下练习,但我无法理解这一点。我是学习Rails的新手,所以请耐心等待我。目前,练习要求我编写一个名为tasty?
的方法,它采用一个参数:
def tasty?(ripe)
end
tasty?
应该:
ripe
为true
,则ripe
为false
规格是:
describe "tasty?" do
it "should return 'Yes' if ripe is true" do
expect( tasty?(true) ).to eq("Yes")
end
it "should return 'Not Yet' if ripe is false" do
expect( tasty?(false) ).to eq("Not Yet")
end
end
我写了这个:
def tasty?(ripe)
if "ripe == 'yes'"
( tasty?("true") ).==("yes")
end
if "ripe == 'not yet'"
( tasty?("false") ).==("not yet")
end
end
运行时收到此消息:
exercise.rb:4: warning: string literal in condition
exercise.rb:7: warning: string literal in condition
谁能告诉我我做错了什么?谢谢您的帮助。
答案 0 :(得分:3)
您收到的错误是由if
声明中的字符串引起的;你应该删除引号,例如:
if ripe == 'yes'
但是,由于ripe
显然总是布尔true
或false
而不是字符串"yes"
,因此您不应将其与"yes"
进行比较。您应该能够将其直接传递给if
语句:
if ripe
…
else
…
end
然后你可以简单地为不同的条件返回所需的字符串:
if ripe
"Yes"
else
"Not yet"
end
这有意义吗?
答案 1 :(得分:3)
由于@eirikir向您展示了错误或您的方式,我将解决另一个问题。
试试这个:
def tasty?(ripe)
if ripe==true
puts "Yes"
else
puts "Not Yet"
end
end
然后
tasty?(true) #=> "Yes"
tasty?(false) #=> "Not Yet"
tasty?(nil) #=> "Not Yet"
tasty?(42) #=> "Not Yet"
最后回归" Not Yet"这是因为:
42==true #=> false
现在试试这个:
def tasty?(ripe)
if ripe
puts "Yes"
else
puts "Not Yet"
end
end
然后:
tasty?(true) #=> "Yes"
tasty?(false) #=> "Not Yet"
tasty?(nil) #=> "Not Yet"
tasty?(42) #=> "Yes"
tasty?(42)
现在返回"Yes"
,因为ripe
评估true
。这是因为,在一个逻辑表达式(例如if..
)中,一个对象评估true
(据说是" truthy")如果它等于除{之外的任何值{1}}或false
。它被称为" falsy"如果它等于nil
或false
。
@craig展示了如何简化后面的表达式。
答案 2 :(得分:1)
根据规范,我会这样写:
def tasty?(ripe)
ripe ? 'Yes' : 'Not Yet'
end
这也可以更详细地写成:
def tasty?(ripe)
if ripe
'Yes'
else
'Not Yet'
end
end
您方法的参数ripe
将根据您提供的规范 - true或false。因此,在您的方法中,您需要检查ripe
是真还是假,然后返回正确的字符串(即,是或否)。
我的第一个例子使用ternary operator,它是if / else语句的简写表达式(如我的第二个代码块所示)。
基本上,它只是询问成熟是否为真,如果是,则返回“是”。如果没有,则返回“Not Yet”。