看下面的代码:
void main() {
int i = 10;
var someFunc = () {
int ni = i;
print(ni)
};
i = 20;
someFunc(); // 20
}
此代码将显示20,但是为什么呢?为什么在这种情况下原始类型的行为类似于引用类型?
答案 0 :(得分:0)
Dart使用词法作用域,如下所示。
void main() {
int i = 10;
var someFunc = () {
int ni = i; // gets the current value of i in main
print(ni);
i = 25; // changes the value of i in main
};
i = 20;
someFunc(); // prints 20
print(i); // prints 25 (since someFunc changed value)
i = 30;
someFunc(); // prints 30
}
为i打印的不同值是因为Dart使用词法作用域。范围控制代码其他部分对变量的访问和可见性。在Dart中,将使用大括号{创建新的后代范围。后代作用域可以访问父作用域中的变量。
someFunc函数创建了一个后代作用域,该后代作用域可以访问父作用域(主)中的变量。因此,当我更改时,someFunc可以访问此更改。 (更多示例:{{3}})
答案 1 :(得分:-1)
此行
DECLARE @str NVARCHAR(MAX);
DECLARE @replacestring nvarchar(max);
declare @stop int = 0;
SET @str = '276-R1E';
select @stop=len(@str);
while @stop>0
begin
select @replacestring = substring(@Str, patindex('%[a-z]%', @str), 1);
select @str = replace(@str,@replacestring, '');
select @stop-=1;
end
SELECT @str;
在您调用int ni = i;
之前不会执行,因此someFunc()
持有的唯一值是在调用int ni
之前分配给int i
的最后一个值< / p>
换句话说,someFunc()
不是指向int ni
的指针(引用类型),只是不更新其值(i
的值),直到您调用{{ 1}}