В Ruby есть способ выполнить то, что `with` делает в Actionscript? - PullRequest
3 голосов
/ 13 апреля 2011

В Ruby я бы хотел выбрать объект по умолчанию для блока.

Пример в ActionScript:

with (board) { 
    length = 66; 
    width = 19; 
    fin_system = 'lockbox'; 
}

Что эквивалентно:

board.length = 66;
board.width = 19;
board.fin_system = 'lockbox';

Вот документация для этого утверждения в Actionscript: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/statements.html#with

Как я могу сделать это в Ruby?

Ответы [ 3 ]

6 голосов
/ 13 апреля 2011
Hash.new.tap do |h|
  h[:name] = "Mike"
  h[:language] = "Ruby"
end
#=> {:name=>"Mike", :language=>"Ruby"} 

Вы можете попробовать Object # tap с Ruby 1.9.

Так что в вашем случае:

board.tap do |b|
  b.length = 66;
  b.width = 19;
  b.fin_system = "lockbox"
end
3 голосов
/ 13 апреля 2011

Один из способов реализовать это с помощью instance_eval, например:

def with(obj, &blk)
  obj.instance_eval(&blk)
end

a = "abc"
with a do
  self << 'b'
  gsub!('b', 'd')
  upcase!
end
puts a #=> ADCD

with board do 
  self.length = 66
  self.width = 19
  self.fin_system = 'lockbox'
end

Но в некоторых случаях вам придется использовать self (с операторами и методами настройки).

1 голос
/ 13 апреля 2011

Вы не можете сделать это точно в Ruby, потому что foo = bar всегда будет устанавливать foo локальную переменную; он никогда не вызовет foo= метод. Вы можете использовать кран, как предложено.

Одним из решений более крупного вопроса дизайна было бы использование свободного интерфейса:

board.length(66).width(20)

class Board
  def length(amt)
    @length = amt
    self
  end

  def width(amt)
    @width = amt
    self
  end
end

Вам решать, подходит ли этот шаблон для вашего варианта использования.

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