【问题标题】:simple if else statement unit conversion cm and in简单的 if else 语句单位转换 cm 和 in
【发布时间】:2013-09-08 23:21:44
【问题描述】:

出于某种原因,这段代码总是将b (2.54) 乘以unit_number,无论我输入的是“cm”还是“in”:

puts "Welcome to my unit conversion calculator. This calculator can convert
between Centimeters and Inches. If you could like to convert Centimeters to Inches, write: in. If you would like to convert Inches to centimeters, write: cm."

unit = gets.to_s

puts " how many of your unit would you like to convert"
unit_number = gets.to_f

a = 0.39370079
b = 2.54

if unit == 'in'      
  puts "your conversion is: #{ (unit_number * a)}"    
else unit == 'cm'
  puts "your conversion is: #{ (unit_number * b)}"
end

【问题讨论】:

  • 欢迎来到 Stack Overflow。请通过发布您已应用于该问题的一些properly formatted 代码、所有相关错误消息与它们显示的完全相同以及您正在测试的任何样本来改进您的问题。另外,请附上格式正确的预期输出样本,以便人们了解您想要达到的结果。
  • 您好,抱歉,我也对这个问题感到困惑,您是否正在寻找这样的解决方案。 read input from console
  • 推测gets 将等于cmin。如果这是真的,那么gets.to_f总是 等于0.0。我错过了什么吗?
  • 您无需输入gets.to_sgets 是 get string 的缩写,这意味着无论如何你都会得到一个字符串。

标签: ruby unit-testing if-statement


【解决方案1】:

gets 将捕获标准输入输入,包括尾随的新行(回车),所以unit 不会是'cm',而是"cm\n"。您需要使用chomp 删除尾随的"\n"

unit = gets.chomp

gets的返回值不需要调用to_s,因为它已经是Stringelse语句应该是elsif unit == 'cm'else if unit == 'cm'

【讨论】:

  • 非常感谢。由于某种原因,程序在使用时运行良好:else 并且在使用时不运行:elseif。我就让它保持原样吧。再次感谢
  • strip 可能比chomp 更好。
  • chomp 在这种情况下最好,因为它更清楚地表明您正在尝试删除尾随空格。更重要的是,chomp 自动处理 Unix 风格的 \n 行尾和 Windows 风格的 \r\n 行尾(这需要通过 strip 显式单独处理)。
【解决方案2】:

您的条件调用 else 语句,而您实际上需要的是 elsif 语句:

elsif unit == 'cm'

基本上,您目前的情况是您的第一个条件(即if unit == 'in')未得到满足(请参阅Pablo B's answer 了解原因)。然而,第二个条件 is 满足,因为它是一个else 语句。由于第一个条件始终为假,else 条件将始终为真。

如果您调用elsif 语句,则条件将首先检查unit == 'in';如果不是,则检查是否unit == 'cm'。如果两者都不为真,则条件将返回nil

【讨论】:

  • 澄清一下,else unit == 'cm' 是两个声明。要查看逻辑流程,请将else 单独放在一行中。然后它将执行两个语句:第一个是表达式unit == 'cm',它的计算结果为false,并被忽略,因为它不是另一个表达式的一部分。然后puts 将执行。您可以使用else ifelseif 的组合。您还需要修复 @Pablo B. 提到的尾随 \n 问题。
  • 非常正确。我知道else unit == 'cm' 是两个陈述。我建议海报将else unit == 'cm'elseif unit == 'cm' 混为一谈。
  • @nonocut,你是什么意思?
  • 你需要使用elsif而不是elseif
  • 虽然这是真的,但另一种语法是 else if, FWIW。
【解决方案3】:

我很清楚你的感受。调试很痛苦。 @akhanubis 已经将您指向处理您的 gets 返回值所需的 #chomp 方法。虽然我假设您编写代码是出于教学目的,但如果您需要 convert physical units for real,只需安装 sy gem。在gem install sy之后,你可以:

require 'sy/imperial'

7.5.inch.in :cm
#=> 19.05
42.cm.in :inch
#=> 16.5354

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多