在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中实现这一目标?
答案 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
由您决定此模式是否适合您的使用案例。