在Io语言中,有两种创建插槽的方法:newSlot和setSlot。两者似乎都有类似的行为,除了newSlot也创建了一个setter。有什么情况需要在创建插槽的同时创建一个setter?无论如何,设定者的目的究竟是什么?
答案 0 :(得分:34)
我相信它提供了良好的编码实践。因此,如果要公开对象属性,则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
将会失败myPetCats := list("Ambrose", "Fluffy", "Whiskers") map (petName,
Pet clone setName(petName)
)
。
所以你需要使用setter:
{{1}}