2017-02-22 8 views
4

Я вызываю функцию, которая ожидает два аргумента. Я использую ту же переменную, но во втором аргументе я устанавливаю эту переменную на другую. Смотрите ниже:Вызов функции с двумя одинаковыми аргументами, но установка второго при вызове

https://dartpad.dartlang.org/2156442de07f56d90b430bc67f3461ac

void main() { 
    String s = 'oi'; 

    aa(s, s = 'oi2'); 
} 
void aa(String buf, String buf2){ 
    print('$buf, $buf2'); 
} 

Это будет печатать "ой, oi2". Я хочу, чтобы это произошло. Я использую модифицированную уведомление в свойствах, как:

set title(String n) { 
    this.modified('title', _title, _title = n); 
} 

Однако, интересно, если это может рассматриваться как ошибка или ожидается.

спасибо, Джо

+0

Я не понимаю, как задействован «заголовок» или ожидаемое поведение? –

+0

@ GünterZöchbauer, геттер - это просто название => _title. Дело в том, что когда я вызываю aa (_title = 'oi', _title = 'something else'), внутри aa первый аргумент - «oi», а второй - «что-то еще», но они оба являются _title в области вызова , Думаю, все в порядке, верно? – Jonathan

+0

Это немного запутанно, потому что вы используете 's' вместо' title' в вопросе. Так почему же первый параметр не имеет значения 'oi2', назначенного внутри' aa() '? –

ответ

2

s является String, которые передаются по значению, а не по ссылке.

aa(s, s = 'oi2'); 

оценивает первый параметр s, который 'oi'
следующий s = 'oi2' оценивается, что означает s получает 'oi2' назначенную
тогда результат s = 'oi2' (который 'oi2') передается в качестве 2-го параметра.

После aa(s, s = 'oi2');s имеет значение oi2.

Смотрите также https://gist.github.com/floitschG/b278ada0316dca96e78c1498d15a2bb9

+0

Я думал, что процессор проанализирует все значения, а затем вызовет функцию, сделав оба аргумента одинаковыми. Я буду использовать это и сохранить одну строку кода. благодаря – Jonathan

1

Оценка порядок аргументов слева-направо, так что вы можете полагаться на значение первого аргумента были найдены путем оценки s к "ii", а затем значение второго аргумента является значение задания s = 'oi2 - который оценивается до "oi2" (и не, технически, путем считывания переменной, просто случается, что переменная записывается с тем же значением перед вызовом функции).

Ожидается - если какая-либо реализация сделает что-то еще, она сломана.