在Ruby中,有没有一种方法可以完成ActionScript中的with with?

| 在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中完成此操作?     
已邀请:
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
    
一种实现方法是使用
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
但是在某些情况下,您必须使用ѭ6(带有运算符和设置方法)。     
您无法在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
由您决定此模式是否适合您的用例。     

要回复问题请先登录注册