Ruby 如何返回一个成员变量的引用

lilijreey · 2018年10月19日 · 最后由 bysxiang 回复于 2018年10月22日 · 1773 次阅读
class X

def initialize
@nilv = nil
@strv = "hello"
end

def get_nilv
  @nilv
end

def get_strv
 @strv
end

def test
  get_nilv = 3 # error why
  get_strv = oo # error
end
end
class X
  def nilv=(val)
    @nilv = val
  end
end

建议买一本 ruby 基础教程从头撸一遍

恶补基础。。。

好久没用 ruby 了,最近在用 ruby 刷 leetcode, 按照自己理解的思路写了,结果发现不对... 其实 ruby 里面无法返回变量的引用。或者说是没有引用类型。

还是基础过一遍吧。也就一天的事。

lilijreey 回复

Ruby 里大量的引用类型。然而你是在替换引用本身,而不是替换引用的值,所以和是否引用类型已经没有关系了。

只修改值可以用get_strv.replace('oo')

楼主一天到晚朝三暮四的寻找替代 Ruby 的语言,怎么可能学得会

ruby 项目里要是有人这么写会被群嘲的。楼主以前写过 ruby,看来之前学的 ruby 基础就不咋牢靠。。。

楼主描述问题的时候需要更准确一点,一是因为 ruby 里不把@nilv称为成员变量,而叫实例变量 (楼主是写 java 的吧?),二是因为 test 方法是不会报"error"的,只是 test 方法没有达到你期望的效果而已(看完这里,楼主是不是要机智的修改问题描述了)。

没达到效果的原因是 ruby 把get_nilv = 3解释成了局部变量赋值,你在 test 中加上一行p get_nilv就会发现输出了 3。如果你想让 ruby 把它解释成方法名而不是变量名,需要使用self.get_nilv=3。当然,这时候才会真正的报 error,提示你没有get_nilv=这个 setter 方法。这个带等号的标识符是方法名,而 3 是它的参数(如果楼主看到这里表示很惊讶的话,就需要反思自己的 ruby 学习历史是不是遗漏了很多东西)。你可以定义get_nilv=这个方法来解决问题,不过你更需要了解attr_accessor这个类方法,这时候你就会知道以上代码有多奇怪了。。。

以上知识点应该是任何一本 ruby 基础书籍前 4 章的内容,建议楼主还是先停下 leetcode,仔细的看看书吧。

lilijreey 回复

恰恰相反 Ruby 只有引用类型

感谢各位大佬的关心,ruby 没有引用传参功能.,所有的传参都是值语义的,传递的是该变量所指向的对象的地址. 之前误认为 ruby 中函数返回的是变量的引用,是自己搞错了。

楼主一直在退步😓

需要 登录 后方可回复, 如果你还没有账号请 注册新账号