什么是Io语言中newSlot和setSlot之间的区别?

Dan*_*Dan 28 iolanguage

在Io语言中,有两种创建槽的方法:newSlot和setSlot.两者似乎都有类似的行为,除了newSlot也创建了一个setter.有什么情况需要在创建插槽的同时创建一个setter?无论如何,塞特的目的究竟是什么?

dra*_*tun 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)
Run Code Online (Sandbox Code Playgroud)

它也可以绕过do()上下文.例如.

Pet := Animal clone do (
    name ::= nil
)

myPetCats := list("Ambrose", "Fluffy", "Whiskers") map (petName,
    Pet clone do (name = petName)   // throws exception
)
Run Code Online (Sandbox Code Playgroud)

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)
)
Run Code Online (Sandbox Code Playgroud)