2014-12-31 6 views
2

Если я использую следующий код в Swift РЕПЛ, я получаю неожиданные результаты:Swift РЕПЛ Неожиданное поведение

1> func addA(s: String)->String { 
    2.  return s + "a" 
    3. } 
    4. 
    5. func addB(s: String)->String { 
    6.  return s + "b" 
    7. } 
    8> 
    9> println(addA("")) 
a 
10> println(addB("")) 
b 
11> println(addA(addB(""))) 
ba 
12> let p = addA(addB("")) 
p: ((String)) = { 
    _core = { 
    _baseAddress = 0x0000000100500060 
    _countAndFlags = 2 
    _owner = (instance_type = Builtin.RawPointer = 0x0000000100500040) 
    } 
} 
13> println(p) 
ba 
14> let q = "a" + "b" 
q: String = "ab" 

почему объявляющий p производить такое поведение, при объявлении q не?

+0

Какое «поведение»? 'p' дает' ba'. Разве это не то, что вы ожидаете? Это похоже на правильный ответ. – matt

+1

@matt, я понимаю, что поведение, на которое делается ссылка, - это массовое эссе от переводчика о том, что такое 'p', материал' core/base/blah/blah' :-) – paxdiablo

+0

Ну, если вы работаете с REPL на некоторое время , что-то перестает быть «неожиданным», а @paxdiablo? – matt

ответ

3

Все, что происходит здесь, заключается в том, что REPL позволяет вам заглянуть внутрь Swift в некоторые из основных преимуществ. p хранится как некоторая функция композиции. Когда оценка необходима, она оценивается. Если вы не хотите, чтобы колбаса была сделана, вы не должны были входить в колбасный завод.

+0

Колбаса завод, хороший. – paxdiablo