0
http://exercism.io/exercises/ruby/kindergarten-garden/readme
这道题相对比较简单,主要是用each_slice进行一次分组,并且通过Hash做一个key-value转换。最后就只需要按照students的序号,找到之前分好组里对应需要的plants就行了。有趣的是,测试用例里面是通过student的名字在找其拥有的plants,那就需要点元编程的技巧了。这里需要用到define_singleton_method去动态定义以student命名的方法。
Posted on
Friday, September 22, 2017
by
醉·醉·鱼
and labeled under
ruby
最近在做exercise.io上面的题练习Ruby,顺便分享一下自己的代码。http://exercism.io/exercises/ruby/kindergarten-garden/readme
这道题相对比较简单,主要是用each_slice进行一次分组,并且通过Hash做一个key-value转换。最后就只需要按照students的序号,找到之前分好组里对应需要的plants就行了。有趣的是,测试用例里面是通过student的名字在找其拥有的plants,那就需要点元编程的技巧了。这里需要用到define_singleton_method去动态定义以student命名的方法。
class Garden
DEFAULT_STUDENTS = %w(alice bob charlie david eve fred ginny harriet ileana joseph kincaid larry)
PLANTS = {
'R' => :radishes,
'C' => :clover,
'G' => :grass,
'V' => :violets
}
def initialize(plants, students=DEFAULT_STUDENTS)
@plants = plants
@students = students.sort
distribute_plants
end
def distribute_plants
# 将两行plants拆分成每两个一组,并对每个plant进行映射转换('R'=>:radishes)
plants_grouped = @plants.split("\n")
.map { |r| r.chars #每一行plants
.each_slice(2) #每两个一组
.map { |plants|
plants.map { |plant| PLANTS[plant] } #每个plant转换一次
}
}
# 给每个student分配plants
@students.each_with_index do |s, i|
break if plants_grouped.first.size < i + 1 # plants不够,就不再分配给student了
#创建singleton method,因为每个garden对应的plants分配是不一样的。define_method是对整个Class创建实例方法
define_singleton_method(s.downcase) do
plants_grouped.map { |e| e[i] }.flatten # 通过索引i,找到student对应的那组plant
end
end
end
end
Post a Comment