Ruby的新手,并且喜欢它。只是玩下面的代码:
public
def highest
highest_number = 0
each do |number|
number = number.to_i
highest_number = number if number > highest_number
puts highest_number
end
end
array = %w{1 2 4 5 3 8 22 929 1000 2}
array.highest
所以我得到的回应是:
1
2
4
5
5
8
22
929
1000
1000
因此它将数组放在第一位,然后是数组中的最高位数。但是我想要的只是最高数字...
我玩过这个并且无法解决这个问题!对不起这样的新手问题
答案 0 :(得分:7)
问题是你在puts
循环中有each
语句,因此在每次迭代中它会打印出当前最高的数字。尝试将其移到each
循环之外,这样就可以了:
public
def highest
highest_number = 0
each do |number|
number = number.to_i
highest_number = number if number > highest_number
end
puts highest_number
end
array = %w{1 2 4 5 3 8 22 929 1000 2}
array.highest
产生所需的输出:
1000
答案 1 :(得分:5)
使用max_by
:
>> a = %w{1 2 4 5 3 8 22 929 1000 2}
=> ["1", "2", "4", "5", "3", "8", "22", "929", "1000", "2"]
>> m = a.max_by { |e| e.to_i }
=> "1000"
您还可以使用其他版本的max_by
:
m = a.max_by(&:to_i)
避免“只调用方法的块”的额外噪音。
但这可能是一个Ruby块学习练习,因此使用标准库的现有部分并不重要。 OTOH,很高兴知道标准库中有什么内容,因此max_by
或max
也可以算作学习练习。
答案 2 :(得分:1)
您可以改为执行此操作,并避免使用highest_number
变量。
array = %w{1 2 4 5 3 8 22 929 1000 2}
class Array
def highest
collect { |x| x.to_i }. \
sort. \
last.to_i
end
end
array.highest # 1000
在这种情况下,collect { |x| x.to_i }
也可以写为collect(&:to_i)
。