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

lilijreey · 2018年10月19日 · 最后由 bysxiang 回复于 2018年10月22日 · 976 次阅读
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
共收到 13 条回复
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中函数返回的是变量的引用,是自己搞错了.

楼主一直在退步😓

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