2012-03-14 5 views
0

У меня есть метод, который принимает условие и элемент из массива условий и массива элементов, где любое количество условий проверяется на любое количество элементов. Условия и элементы - это хэши. В принципе, для условия и элемента, поданного методу, выясните, какой атрибут элемента необходимо проверить. Список на самом деле длиннее и, глядя на то, чтобы сделать это лучше (кажется, что это может быть более кратким и, возможно, более рубиновым), ничего больше не работало (пока), поэтому я хотел бы внести свой вклад в то, как вы могли бы реорганизовать это:Репликатор case case, basic ruby ​​

def check_condition(condition, item) 
    case condition.attribute 
    when :author 
     i = item.author.name; 
    when :title 
     i = item.title 
    when :body 
     i = item.body 
    when :domain 
     i = URI(item.url).host 
    when :account_age 
     i = item.author.author_age 
    end 
    @logger.info "#{i} to be checked if #{condition.query} #{condition.attribute}" 
    test_condition(condition, item, i) 
    end 

EDIT:

Просто, чтобы сделать более ясным, пункты и условия Хэши (Hashie :: Mash, чтобы быть точным), где условия в целом, построенные из конфигурационного файла, который может быть что-то вроде:

[submitted_link, account_age, is_less_than, 30, remove] 

что-то вроде:

{subject: submitted_link, attribute: account_age, query: is_less_than, what: 30 action:remove} 

И вы можете увидеть, что происходит в целом здесь, если вы так склонны: https://github.com/blueblank/reddit_modbot/blob/master/lib/modbot/modbot_check.rb

EDIT2:

Действительность решения было несколько легализовать мою переменную терминологию для условия и пункт таким образом это может быть уменьшено до 1 линии

i = item.send(condition.attribute) 

не бардак, минимальное воздействие

ответ

2

Один из вариантов может включать определение check_condition как метода item.class. Так что вместо того, чтобы ...

x = check_condition(c, item) 

... Вы могли бы иметь что-то вроде ...

x = item.condition(c) 

Тогда, если вам не нравится большой случай, вы можете создать хэш со значениями, которые Учеб объекты, введенные пользователем на :author, :title, и т.д.

class A 
    def initialize 
    @h = { :a => proc { @author } } 
    end 
    def set x 
    @author = x 
    end 
    def f x 
    @h[x].call 
    end 
end 

o = A.new 
o.set 'Me' 
p(o.f(:a)) 

Однако, как только вы , что, вы можете захотеть сделать третий шаг, который должен был бы изменить все эти атрибуты объекта на значения в Hash в первую очередь ... возможно ...