Руби назначить контекст лямбда? - PullRequest
5 голосов
/ 19 сентября 2011

Можно ли не назначать контекст лямбде?

Например:

class Rule
  def get_rule
    return lambda {puts name}
  end
end

class Person
  attr_accessor :name

  def init_rule 
    @name = "ruby"
    Rule.new.get_rule.call() # should say "ruby" but say what object of class Rull, does not have variable name
    # or self.instance_eval &Rule.new.get_rule
  end
end

Моя цель -> объекты хранимых процедур без контекстов и назначать контекст перед вызовом в определенных местах.Возможно ли это?

Ответы [ 3 ]

9 голосов
/ 19 сентября 2011

Да, но будьте осторожны с этим, этим действительно легко злоупотреблять. Я бы лично опасался такого кода.

class Rule
  def get_rule
    Proc.new { puts name }
  end
end

class Person
  attr_accessor :name

  def init_rule 
    @name = "ruby"
    instance_eval(&Rule.new.get_rule)
  end
end
8 голосов
/ 11 октября 2011

Немного опоздал на вечеринку, но вот альтернативный способ сделать это, явно передавая контекст правилу.

class Rule
  def get_rule
    return lambda{|context| puts context.name}
  end
end

class Person
  attr_accessor :name
  def init_rule
    @name = "ruby"
    Rule.new.get_rule.call(self)
  end
end

Person.new.init_rule
#=> ruby
1 голос
/ 08 марта 2014

В духе действительно опоздания на вечеринку; -)

Я думаю, что шаблон, который вы здесь используете, - это шаблон Стратегии. Это разделяет проблемы между кодом, который изменяет «правила» и часть, которая повторно используется "человек". Другая сила этого шаблона что вы можете изменить правила во время выполнения.

Как это могло бы выглядеть

class Person
  attr_accessor :name

  def initialize(&rules)
    @name = "ruby"
    instance_eval(&rules)
  end
end

Person.new do 
  puts @name
end

=> ruby
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...