在 Io 语言中,有两种创建槽的方法:newSlot 和 setSlot。两者似乎都有相似的行为,除了 newSlot 也创建了一个 setter。什么情况下需要在创建插槽的同时创建 setter?无论如何,二传手的目的到底是什么?
问问题
1754 次
1 回答
35
我相信它提供了良好的编码实践的便利。因此,如果您想公开对象属性,那么newSlot
或其同义词::=
是首选方法。
newSlot
可以让事情看起来更好。例如。
Animal := Object clone do (
legs ::= nil // creates leg slot & setLegs() setter
tail ::= nil // creates tail slot & setTail() setter
)
// I think below is more aesthetic
Cat := Animal clone setLegs(4) setTail(1)
// compared to this
Dog := Animal clone do (legs = 4; tail = 1)
它还可以绕过do()
上下文。例如。
Pet := Animal clone do (
name ::= nil
)
myPetCats := list("Ambrose", "Fluffy", "Whiskers") map (petName,
Pet clone do (name = petName) // throws exception
)
将Pet clone do (name = petName)
死投掷Exception: Pet does not respond to 'petName'
,因为do()
在克隆的Pet
上下文中被解释,所以它看不到petName
。
因此,您需要使用 setter:
myPetCats := list("Ambrose", "Fluffy", "Whiskers") map (petName,
Pet clone setName(petName)
)
于 2011-05-12T12:10:24.703 回答