Seb*_*ian 4 ruby arrays iteration loops block
我是红宝石新手。我正在尝试执行以下操作,但没有成功。
我有一个对象数组,我们称它为objs。每个对象都有多个属性,其中之一是一个保存数字的变量,我们称其为val1。我想遍历对象数组,并确定所有对象的val1最大值。
我尝试了以下方法:
def init(objs)
@objs = objs
@max = 0
cal_max
end
def cal_max
@max = @objs.find { |obj| obj.val1 >= max }
# also tried
@objs.each { |obj| @max = obj.val1 if obj.val1 >= @max }
end
Run Code Online (Sandbox Code Playgroud)
正如我所说,我只是在学习块。
任何建议都欢迎。
谢谢
@objs.map(&:val1).max
Run Code Online (Sandbox Code Playgroud)
这将调用每个对象上的方法,并创建一个新的结果数组,然后找到最大值。这是以下内容的简写:
@objs.map{ |o| o.val1 }.max
Run Code Online (Sandbox Code Playgroud)
或者,您可以选择具有最大值的对象,然后对其进行操作(如下 Cary Swoveland 的正确推荐):
@objs.max_by(&:val1).val1
Run Code Online (Sandbox Code Playgroud)
假设您已建立以下模型:
class SomeObject
attr_accessor :prop1, :prop2, :val1
def initialize(prop1, prop2, val1)
@prop1 = prop1
@prop2 = prop2
@val1 = val1
end
end
#define your objects from the class above
david = SomeObject.new('David', 'Peters', 23)
steven = SomeObject.new('Steven', 'Peters', 26)
john = SomeObject.new('John', 'Peters', 33)
#define an array of the above objects
array = [david, steven, john]
Run Code Online (Sandbox Code Playgroud)
然后max_by将条件按如下所述通过将其传递到其块中来确定具有最大值的对象val1。最后调用val1以获取max对象的值。
array.max_by {|e| e.val1 }.val1 #=> 33
Run Code Online (Sandbox Code Playgroud)
您也可以考虑使用散列(无需定义新类),如下所示:
david = {f_name: 'David', s_name: 'Peters', age: 23}
steven = {f_name: 'Steven', s_name: 'Peters', age: 26}
john = {f_name: 'John', s_name: 'Peters', age: 33}
array = [david, steven, john]
array.max_by { |hash| hash[:age] }[:age] #=> 33
Run Code Online (Sandbox Code Playgroud)