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
好久没用 ruby 了,最近在用 ruby 刷 leetcode, 按照自己理解的思路写了,结果发现不对... 其实 ruby 里面无法返回变量的引用。或者说是没有引用类型。
Ruby 里大量的引用类型。然而你是在替换引用本身,而不是替换引用的值,所以和是否引用类型已经没有关系了。
只修改值可以用get_strv.replace('oo')
。
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,仔细的看看书吧。
感谢各位大佬的关心,ruby 没有引用传参功能.,所有的传参都是值语义的,传递的是该变量所指向的对象的地址. 之前误认为 ruby 中函数返回的是变量的引用,是自己搞错了。