为什么我的函数不打印排序的数组?

时间:2014-06-16 22:59:51

标签: ruby arrays sorting methods

# Methods for calculating
# print out the input that the user entered
def PrintScores(*numbers)
    numbers.each {|x| print x.join(" ")}
    puts
end

#print out the scores in ascending order
def ListScores(*numbers)
    numbers.sort!
    print numbers
end

# Main function
out_file = File.new("out.txt", "w")

puts "Enter the scores you wish to have our stats program look into? "
user_input = gets.chomp

input_array = user_input.split(" ")

input_array.map! do |x|
    x.to_i
end

PrintScores(input_array)
ListScores(input_array)

ListScores函数仍然按照我输入的顺序打印数组,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:2)

  

ListScores函数仍然按照我输入的顺序打印数组,我无法找出原因?

在当前代码中,input_arrayArray类的实例,它作为参数传递给ListScores方法。 ListScores期待splat arguments,因此numbers成为包含单个数组元素的数组(即input_array内容)。这是您在尝试对数组进行排序时以相同顺序查看数组的原因。

例如:

> user_input = gets.chomp
3 2 8 5 1
 => "3 2 8 5 1" 
> input_array = user_input.split(" ")
 => ["3", "2", "8", "5", "1"] 
>   input_array.map! do |x|
>         x.to_i
>   end
 => [3, 2, 8, 5, 1] 
> ListScores(input_array)
[[3, 2, 8, 5, 1]] => nil ## Notice Array with single Array element [[]]
当您需要变量参数列表时,

splat operator*)用于方法。 在您的情况下,您不需要PrintScoresListScores方法中的splat运算符。

def PrintScores(numbers) ## <-- Removed splat operator
    numbers.each {|x| print x.join(" ")}
    puts
end

#print out the scores in ascending order
def ListScores(numbers) ## <-- Removed splat operator
    numbers.sort!
    print numbers
end

示例输出:

>   ListScores(input_array)
 [1, 2, 3, 5, 8] => nil 

注意:建议使用 snake_case 作为方法名称,例如list_scores而不是ListScores