gpt4 book ai didi

ruby - 参数是通过引用还是值传递给方法?

转载 作者:数据小太阳 更新时间:2023-10-29 06:45:38 24 4
gpt4 key购买 nike

当您将参数传递给 Ruby 中的方法时,任何人都可以扩展、更正或验证我的感受。这些点有错吗?我遗漏了什么吗?

  • Ruby 中的一切都是对象。
  • 变量是对对象的引用
  • (将变量传入方法时):方法中捕获变量的参数是该方法的局部变量。参数(局部变量)现在也有对同一对象的引用。
  • 我可以(就地)改变对象,当退出方法范围时,这种改变将保持不变。在方法范围之外引用此对象的任何变量都将反射(reflect)该对象已被更改。
  • 对该参数(局部变量)的新赋值不会改变原始对象,因此当方法离开作用域时对它的任何引用都将保持不变。
  • 如果我将一个变量传递给引用一个整数的方法,那么一旦该方法退出,我就不可能让该变量引用一个新的整数。

有没有办法让一个方法将一个整数作为其参数之一,做一些事情,并且可能作为副作用改变值,一旦方法退出就会反射(reflect)出这种变化。也许我只是没有考虑“Ruby 方式”。

最佳答案

Everything in Ruby is an object.

足够接近了。

Variables are references to objects

没有。一个变量“命名”一个对象:当一个变量被评估时,它评估为它当前“命名”的对象。在内部,这是通过“存储一个指针”(或等效机制)到一个对象来完成的。 (虽然实现不需要总是使用指针:例如,在 Ruby MRI 中,Fixnum 值实际上存在没有真正的对象。)

(When passing in a variable into a method): The parameter in the method that catches the variable is a local variable to that method. The parameter (local variable) now also has a reference to the same object.

没有。往上看。但是,这两个变量现在都命名(或“计算为”)同一个对象。使用 Call-by-Value内部传递参数-- 也就是说,在内部,指向对象的指针被传递了 -- 虽然 Ruby 有 Call-by-Object-Sharing语义,这是我尝试推广的一个术语,因为我发现它简洁地描述了行为。

I could alter the object (in place) and this alteration will hold when the method scope is exited. Any variables referencing this object outside the method scope will reflect that the object has been altered.

是的,一个对象就是它自己。如果你改变那个对象,你就会在所有地方改变那个对象。但请注意:所有变量均未更改。内部变量和外部变量仍然命名(或“计算为”)相同的对象

A new assignment to that parameter (local variable) does not change the original object, thus any references to it when the method leaves scope will remain unchanged.

正确。如果你给你创建的局部变量赋不同的值,局部变量,命名一个不同的对象。 Ruby 不是 Call-by-Reference因此调用上下文中的变量不会改变。

If I am passing a variable into the method that references an Integer there is effectively no way that once that method exits I could have that variable referencing a new Integer?

变量从不传递。 变量根据它们命名的对象进行评估,并传递这些对象。无论如何,我们知道:

  1. Ruby 不是引用调用;
  2. 整数 (Fixnums) 是不可变的

因此:

x = 1
y.foo(x)

永远 不能改变 x 名称,它甚至不能改变对象 x 名称的内容(因为它是不可变的).即使 x 命名的对象是可变的,方法也不可能改变什么对象 x 名称:它只能变异 x 计算结果的对象。

快乐编码。


现在,Ruby 之道——在我的书中——将使用更好的返回值来涵盖所有新状态,并让调用者将其放在需要去的地方:- )

当然,可变对象(包括简单数组)也是一种选择,但这恶心。而且,如果有足够多的状态一起旅行,它可能是一个单独的类的候选者。


作为结束语:Ruby 支持闭包的概念,因此可以以词法作用域的方式:

x = 1; (lamb­da {|a| x = a}).c­all(2); x  // => 2

(这是为一个简单的 lambda 展示的,但可以设计/制作一个方法来类似地工作:在所有像这样的愚蠢的反例中,外部 变量本身需要然而,众所周知,因为 lambda/方法无法将外部变量名设为新对象。)

关于ruby - 参数是通过引用还是值传递给方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com