在Ruby中,有没有一种方法可以实现“with”在Actionscript中的功能?

在Ruby中,有没有一种方法可以实现“with”在Actionscript中的功能?,ruby,actionscript,Ruby,Actionscript,在Ruby中,我想为块选择一个默认对象 Actionscript中的一个示例是: with (board) { length = 66; width = 19; fin_system = 'lockbox'; } 这相当于: board.length = 66; board.width = 19; board.fin_system = 'lockbox'; 以下是Actionscript中此语句的文档: 我如何在Ruby中实现这一点 Hash.new.tap d

在Ruby中,我想为块选择一个默认对象

Actionscript中的一个示例是:

with (board) { 
    length = 66; 
    width = 19; 
    fin_system = 'lockbox'; 
}
这相当于:

board.length = 66;
board.width = 19;
board.fin_system = 'lockbox';
以下是Actionscript中此语句的文档:

我如何在Ruby中实现这一点

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

因此,在你的情况下:

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

在Ruby中不能完全做到这一点,因为
foo=bar
将始终设置一个
foo
局部变量;它永远不会调用
foo=
方法。您可以按照建议使用tap

更大设计问题的一个解决方案是使用流畅的界面:

board.length(66).width(20)

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

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

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

实现此模式的一种方法是使用
instance\u 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
def带(obj和blk)
对象实例评估(&blk)
结束
a=“abc”
干劲十足
自我ADCD
用木板做
自我长度=66
自宽=19
self.fin_系统='lockbox'
结束

但在某些情况下,您必须使用
self
(带有运算符和设置方法)。

为什么要使用?除了eval,with是ECMAScript(又称javascript和actionscript)最糟糕的部分@看不见的bob,你为什么认为
with
不好?只是为了interest@invisible鲍勃,最简单/最快的答案是遵循枯燥的原则。重复键入
板。
不干燥。谢谢!我以前从未见过
tap()
。我仍然想保存这两次击键(
b.
)。我想用(obj,hash)函数创建一个
,该函数允许
与board、{:length=>66、:width=>19、:fin_system=>“lockbox”}
,但这只是将按键移动到
,以及
。谢谢,这是一个很好的解决方案。但我认为,正如@MikeLewis所描述的那样,使用Ruby的原生
点击
,更加优雅,省去了按键,而且。。。他是本地人。