В языке Io существует два способа создания слотов: newSlot и setSlot. Оба, похоже, имеют аналогичное поведение, за исключением того, что newSlot также создает сеттер. Какие случаи существуют для необходимости создания сеттера одновременно с созданием слотов? В чем же цель целителя?
В чем разница между newSlot и setSlot на языке Io?
Ответ 1
Я считаю, что это удобство, которое обеспечивает хорошие методы кодирования. Таким образом, если вы хотите выставить атрибут объектов, тогда 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)
)