在Ruby中,有没有一种方法可以实现“with”在Actionscript中的功能?
在Ruby中,我想为块选择一个默认对象 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
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的原生点击,更加优雅,省去了按键,而且。。。他是本地人。