Ruby 计算序号不起作用?真糊涂

Ruby 计算序号不起作用?真糊涂,ruby,Ruby,有人能帮我吗,因为我不知道为什么下面的数字不起作用 22、23、32、33 在if-else语句中,例如,如果输入22,执行22%10,则返回2,但当我转到ordinal方法时,它不会转到2,而是返回th def ordinal(right_digit) if right_digit == 1 return "st" elseif right_digit == 2 return "nd" elseif right_digit ==

有人能帮我吗,因为我不知道为什么下面的数字不起作用

22、23、32、33

在if-else语句中,例如,如果输入22,执行22%10,则返回2,但当我转到ordinal方法时,它不会转到2,而是返回th

   def ordinal(right_digit)

    if right_digit == 1
        return "st"
    elseif right_digit == 2
        return "nd"
    elseif right_digit == 3
        return "rd"
    else
        return "th"
    end

end


puts "Enter a number: "
# converts string to an integer
input = gets.chomp.to_i
right_digit = input % 10

puts "That's the #{input}#{ordinal(right_digit)} "
ruby中没有elseif关键字。是埃尔西夫

为了避免此类打字错误,最好在这种情况下使用case:

case right_digit
when 1 then "st"
when 2 then "nd"
when 3 then "rd"
else "th"
end

另外,不需要显式返回方法中的最后一条语句,它是自动完成的。

如果查看语法突出显示,您可以很容易地看到elseif没有作为关键字突出显示。这是因为Ruby中没有elseif关键字。它的拼写是elsif

例如,如果您要求编辑器自动格式化代码或将其复制粘贴到Pry中,您将看到Ruby是如何解释代码的:

def ordinal(right_digit)
  if right_digit == 1
    return "st"
    elseif right_digit == 2
    return "nd"
    elseif right_digit == 3
    return "rd"
  else
    return "th"
  end
end
换句话说,由于Ruby中没有elseif关键字,因此它将简单地将elseif解释为方法调用。这与:

def ordinal(right_digit)
  if right_digit == 1
    return "st"
    self.elseif(right_digit == 2)
    return "nd"
    self.elseif(right_digit == 3)
    return "rd"
  else
    return "th"
  end
end
因此,在条件语句中只有两种情况:right_digit==1和else。对于除1以外的所有数字,它将归入else大小写并返回“th”。对于1,它将属于第一种情况,并返回'st',因为它已在第3行返回,它将永远不会到达对不存在的elseif方法的调用,因此永远不会有NoMethodError

可以从中吸取一些教训:

阅读警告:您的代码生成两个警告:警告:使用elseif的两行语句未到达。这应该会告诉你这些线路有问题。 注意语法突出显示:即使是堆栈溢出问题框中极其糟糕、技术含量低、基本的语法突出显示,也已经显示出您的错误。一个合适的编辑器或IDE将更加明显。 注意你的IDE:在我的IDE中,我在elseif下面有一条黄色的曲线,警告我elseif方法不存在。同样,它还警告我第一次返回后的代码不可访问。 使用linter/静态代码检查器:例如,RuboCop还将在第一次返回后查找无法访问的代码。 修复代码最明显的方法是简单地使用elsif的正确拼写:

然而,我们还可以做更多的事情。在Ruby中,所有内容都是一个表达式,即所有内容的计算结果都是一个值。Ruby中没有任何语句。因此,if也是一个表达式,其计算结果为所采用分支的值。因此,不需要返回每个分支的值,我们只需返回if的值:

其次,方法的返回值隐式地是在方法体中计算的最后一个表达式的值。在本例中,最后一个也是事实上唯一的表达式是条件if表达式,因此我们不需要显式返回它:

def ordinal(right_digit)
  if right_digit == 1
    "st"
  elsif right_digit == 2
    "nd"
  elsif right_digit == 3
    "rd"
  else
    "th"
  end
end
接下来,Ruby有一个多路条件表达式,称为case表达式,通常比多路条件表达式更容易阅读,如果:

还有一种不同形式的情况,即使用===方法将分支的不同条件值与顶部的测试值进行比较,对于整数,该方法正好相等,因此在这种情况下,它将做正确的事情:

def ordinal(right_digit)
  case right_digit
  when 1
    "st"
  when 2
    "nd"
  when 3
    "rd"
  else
    "th"
  end
end
最后,建议您仅在实际使用双引号提供的任何功能时使用双引号字符串,即字符串插值和转义序列:

def ordinal(right_digit)
  case right_digit
  when 1
    'st'
  when 2
    'nd'
  when 3
    'rd'
  else
    'th'
  end
end

正如Jörg所说,阅读警告。为此,请使用-w选项运行ruby:

更简洁地说:

ord = [nil,'st','nd','rd'][right_digit] || 'th'
也许:

ord = ['th','st','nd','rd'][right_digit] || 'th'
…如果我们想要第0个

作为一种方法:

ORDINALS = ['th','st','nd','rd']

def ordinal(nb)
  ORDINALS[nb] || 'th'
end
代码片段的JAVASCRIPT

常量=['th','st','nd','rd']; 函数序号b{ 返回单词[nb]| | th'; } 设i=0;
对于我像这样的问题有助于查找表,因为它使事情变得非常琐碎:

ORDINAL = %w[ th st nd rd th th th th th th ]

def ordinal(n)
  ORDINAL[n % 10 ]
end

现在,您可以拨打序号999,无需做任何特殊的准备来提取正确的数字。

请使用一致的缩进。大多数红宝石爱好者选择两个空格。
ord = [nil,'st','nd','rd'][right_digit] || 'th'
ord = ['th','st','nd','rd'][right_digit] || 'th'
ORDINALS = ['th','st','nd','rd']

def ordinal(nb)
  ORDINALS[nb] || 'th'
end
ORDINAL = %w[ th st nd rd th th th th th th ]

def ordinal(n)
  ORDINAL[n % 10 ]
end