Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将罗马数字转换为阿拉伯语的方法';不要打印答案_Ruby - Fatal编程技术网

Ruby 将罗马数字转换为阿拉伯语的方法';不要打印答案

Ruby 将罗马数字转换为阿拉伯语的方法';不要打印答案,ruby,Ruby,我正在创建一个将罗马数字转换为整数的方法。我写过这样的话: def roman_to_integer(roman) roman = roman.upcase num_I = roman.count("I").to_i num_V = roman.count("V").to_i num_X = roman.count("X").to_i num_L = roman.count("L").to_i num_C = roman.count("C").to_i num_

我正在创建一个将罗马数字转换为整数的方法。我写过这样的话:

def roman_to_integer(roman)
  roman = roman.upcase 

  num_I = roman.count("I").to_i 
  num_V = roman.count("V").to_i
  num_X = roman.count("X").to_i
  num_L = roman.count("L").to_i
  num_C = roman.count("C").to_i
  num_D = roman.count("D").to_i
  num_M = roman.count("M").to_i

  rom_num = { "I" => 1, 
              "V" => 5, 
              "X" => 10,
              "L" => 50,
              "C" => 100,
              "D" => 500,
              "M" => 1000 }

    while roman 
      if roman[0] == "M"
        integer = num_M * rom_num["M"] + num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "D"
        integer = num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "C"
        integer = num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "L"
        integer = num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "X"
        integer = num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "V"
        integer = num_V * rom_num["V"] + num_I * rom_num["I"]
      elsif roman[0] == "I"
        integer = num_I * rom_num["I"]
      end
    end
    return integer
end

puts "Tell me any number in Roman System and I will convert it to the Arabic Number!"
number = gets.chomp
puts "Here is your number:"
puts(roman_to_integer(number))
当它到达最后一行,在那里它应该打印出结果,我只是在命令行中得到一个空的输入行。我不明白为什么它不起作用,需要一些帮助来找出哪里的代码是错误的

如果我使用

puts number.roman_to_integer
作为最后一句话,我明白了

private method "roman_to_integer" called on "":String (NoMethodError)

如有任何帮助,将不胜感激。

删除
循环。我不认为这会给代码增加什么。我还改进了格式,删除了多余的
to\s
方法

def roman_to_integer(roman)

  roman = roman.upcase 

  # Counts the occurrences of each letter from the input

  num_I = roman.count("I") 
  num_V = roman.count("V")
  num_X = roman.count("X")
  num_L = roman.count("L")
  num_C = roman.count("C")
  num_D = roman.count("D")
  num_M = roman.count("M")

  # Assigns values to every Roman letter

  rom_num = { "I" => 1, 
              "V" => 5, 
              "X" => 10,
              "L" => 50,
              "C" => 100,
              "D" => 500,
              "M" => 1000 }

    # Multiplies the value of the letter by number of occurrences          


  if roman[0] == "M"
    integer  = num_M * rom_num["M"] + num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
  elsif roman[0] == "D"
    integer = num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "C"
    integer = num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "L"
    integer = num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "X"
    integer = num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "V"
    integer = num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "I"
    integer = num_I * rom_num["I"]
  end

  return integer
end

puts "Tell me any number in Roman System and I will convert it to the Arabic Number!"

number = gets.chomp
puts "Here is your number:"
puts roman_to_integer(number)

另外,要使
puts number.roman_to_integer
工作,您必须将您的方法添加到字符串类中,顺便说一句,您不应该这样做。

在执行
循环时删除
。我不认为这会给代码增加什么。我还改进了格式,删除了多余的
to\s
方法

def roman_to_integer(roman)

  roman = roman.upcase 

  # Counts the occurrences of each letter from the input

  num_I = roman.count("I") 
  num_V = roman.count("V")
  num_X = roman.count("X")
  num_L = roman.count("L")
  num_C = roman.count("C")
  num_D = roman.count("D")
  num_M = roman.count("M")

  # Assigns values to every Roman letter

  rom_num = { "I" => 1, 
              "V" => 5, 
              "X" => 10,
              "L" => 50,
              "C" => 100,
              "D" => 500,
              "M" => 1000 }

    # Multiplies the value of the letter by number of occurrences          


  if roman[0] == "M"
    integer  = num_M * rom_num["M"] + num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]
  elsif roman[0] == "D"
    integer = num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "C"
    integer = num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "L"
    integer = num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "X"
    integer = num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "V"
    integer = num_V * rom_num["V"] + num_I * rom_num["I"]

  elsif roman[0] == "I"
    integer = num_I * rom_num["I"]
  end

  return integer
end

puts "Tell me any number in Roman System and I will convert it to the Arabic Number!"

number = gets.chomp
puts "Here is your number:"
puts roman_to_integer(number)

另外,要使
put number.roman_to_integer
工作,您必须将您的方法添加到String类中,顺便说一句,这是不应该的。

您的方法不会返回,因为它卡在
而roman
块中-因为您不更改
roman
变量,所以它总是真实的,块将继续一次又一次地运行,永远不会返回值:

while roman
  #... runs forever
end

不管怎样,您的方法似乎并没有像您认为的那样执行(
'IX'
将返回1?

您的方法不会返回,因为它卡在
while roman
块中-因为您没有更改
roman
变量,它将始终是真实的,并且该块将继续一次又一次地运行,从不返回值:

while roman
  #... runs forever
end

不管怎样,你的方法似乎并没有达到你认为的效果(
'IX'
将返回1?

是的,在解决问题的同时删除
!非常感谢。通过向string类添加方法-ok,这很有意义,因此我的特定方法适用于string类。我不知道怎么做,即使我知道怎么做,我也会听从你的建议:)虽然我是对的,但我没有解释原因,因此@urigassi有更好的答案。他还指出,您的程序可能运行不正常。谢谢您的指导!我是StackOverflow的新手,刚刚开始了解社区中的事情是如何运作的。我已经将@urigassi reply标记为最佳答案。是的,删除
,同时解决它!非常感谢。通过向string类添加方法-ok,这很有意义,因此我的特定方法适用于string类。我不知道怎么做,即使我知道怎么做,我也会听从你的建议:)虽然我是对的,但我没有解释原因,因此@urigassi有更好的答案。他还指出,您的程序可能运行不正常。谢谢您的指导!我是StackOverflow的新手,刚刚开始了解社区中的事情是如何运作的。我已经将@UriAgassi回复标记为最佳答案。干杯!删除“while”有效!事实上,它目前对“IX”不起作用。没有太多的细节——任务是让它与旧罗马系统一起工作,旧罗马系统接受像VIIII=9这样的东西。无论如何,我会在以后尝试改进它,让它和“IX”和“XL”等一起工作。干杯!删除“while”有效!事实上,它目前对“IX”不起作用。没有太多的细节——任务是让它与旧罗马系统一起工作,旧罗马系统接受像VIIII=9这样的东西。无论如何,我将在以后尝试改进它,使它能够和“IX”和“XL”等一起工作。