#iolanguage
#iolanguage
Вопрос:
На языке ввода-вывода существует 2 метода для создания слотов: newSlot и setSlot. Похоже, что оба имеют схожее поведение, за исключением того, что newSlot также создает установщик. В каких случаях требуется, чтобы сеттер создавался одновременно с созданием слота? В любом случае, какова именно цель установщика?
Комментарии:
1. Мне также было интересно, что такое сеттер в конце первого дня ввода-вывода на 7 языках за 7 недель.
Ответ №1:
Я считаю, что это удобство, которое обеспечивает хорошую практику кодирования. Таким образом, если вы хотите предоставить атрибут objects, то предпочтительным способом является newSlot
или его синоним ::=
.
newSlot
может улучшить внешний вид. Например.
Animal := Object clone do (
legs ::= nil // creates leg slot amp; setLegs() setter
tail ::= nil // creates tail slot amp; 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)
)