Dart:为什么原始类型的行为类似于引用类型?

时间:2019-09-09 11:30:22

标签: dart

看下面的代码:

void main() {
    int i = 10;
    var someFunc = () {
        int ni = i;
        print(ni)
    };
    i = 20;
    someFunc(); // 20
}

此代码将显示20,但是为什么呢?为什么在这种情况下原始类型的行为类似于引用类型?

2 个答案:

答案 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}}