【发布时间】:2015-08-04 07:39:16
【问题描述】:
红宝石新手。写了一个程序现在尝试元编程。如您所见,我有下面的代码。有标记的常用语句。我如何将这些写在一个地方并一次又一次地使用它们。 这些语句是循环的一部分。所以就像我只想有插入语句的能力。尝试了一个proc,它似乎可以工作。但是还没有真正理解好。行话让我明白了。 我应该好好阅读什么以及什么是好的来源。 有3个循环要做。循环的开始根据条件而不同,每个循环中只有一个语句不同。我怎么写这个清洁和干燥
@ids.each do |key, ids|
key_ids = []
case key
when :flows then next
when :morals
ids.each_with_index do |id, index|
relation = {for: nil, state: nil}; @objects.each_key { |key| relation[key] = nil unless key == :flows } #Common A
relation.merge!(ids_string); relation[:for] = key; relation[key] = id #Common B
relation[:values] = S(@ids[:values][index])
@stack << relation #Common C
key_ids << id unless @stack.find{ |relation| relation.class != Hash && relation[:for] == key.to_s && relation[key] == id } #Common D
end
when :values
ids.flatten.uniq.each do |id|
relation = {for: nil, state: nil}; @objects.each_key { |key| relation[key] = nil unless key == :flows } #Common A
relation.merge!(ids_string); relation[:for] = key; relation[key] = id; #Common B
ids.each_with_index { |array, index| !array.include?(id) ? relation[:morals] = S(A(relation[:morals]) - A(@ids[:morals][index])) : () }
@stack << relation #Common C
key_ids << id unless @stack.find{ |relation| relation.class != Hash && relation[:for] == key.to_s && relation[key] == id } #Common D
end
else
ids.each do |id|
relation = {for: nil, state: nil}; @objects.each_key { |key| relation[key] = nil unless key == :flows } #Common A
relation.merge!(ids_string); relation[:for] = key; relation[key] = id #Common B
@stack << relation #Common C
key_ids << id unless @stack.find{ |relation| relation.class != Hash && relation[:for] == key.to_s && relation[key] == id } #Common D
end
end
!key_ids.empty? ? TaleRelation.where(for: key , key => key_ids).each { |activerecord| activerecord[:state] = nil; @stack << activerecord } : ()
end
【问题讨论】:
标签: ruby lambda codeblocks procedures