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

#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)
)