布尔运动

时间:2015-08-11 19:21:49

标签: ruby boolean-logic

我正在课程中进行以下练习,但我无法理解这一点。我是学习Rails的新手,所以请耐心等待我。目前,练习要求我编写一个名为tasty?的方法,它采用一个参数:

def tasty?(ripe)  
end  

tasty?应该:

    如果ripetrue ,则
  • 返回“是” 如果ripefalse
  • ,则
  • 返回“Not Yet”

规格是:

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  

谁能告诉我我做错了什么?谢谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您收到的错误是由if声明中的字符串引起的;你应该删除引号,例如:

if ripe == 'yes'

但是,由于ripe显然总是布尔truefalse而不是字符串"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"如果它等于nilfalse

@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”。