Подтвердить что ты не робот

В чем разница между newSlot и setSlot на языке Io?

В языке Io существует два способа создания слотов: newSlot и setSlot. Оба, похоже, имеют аналогичное поведение, за исключением того, что newSlot также создает сеттер. Какие случаи существуют для необходимости создания сеттера одновременно с созданием слотов? В чем же цель целителя?

4b9b3361

Ответ 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)
)