В чем разница между newSlot и setSlot в языке Io? - PullRequest
28 голосов
/ 12 мая 2011

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

1 Ответ

34 голосов
/ 12 мая 2011

Я считаю, что это удобство, которое обеспечивает хорошую практику кодирования. Таким образом, если вы хотите предоставить атрибут объекта, то 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)
)
...