在Ruby中,有没有办法在Actionscript中完成`with`呢?

时间:2011-04-13 18:49:04

标签: ruby actionscript

在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 个答案:

答案 0 :(得分:6)

Hash.new.tap do |h|
  h[:name] = "Mike"
  h[:language] = "Ruby"
end
#=> {:name=>"Mike", :language=>"Ruby"} 

您可以使用Ruby 1.9尝试Object#tap

所以在你的情况下:

board.tap do |b|
  b.length = 66;
  b.width = 19;
  b.fin_system = "lockbox"
end

答案 1 :(得分:3)

实现它的一种方法是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(使用运算符和设置方法)。

答案 2 :(得分:1)

你无法在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

由您决定此模式是否适合您的使用案例。