Ruby:类定义中的self关键字
将self.name.split替换为@name.split是同一件事吗Ruby:类定义中的self关键字,ruby,self,Ruby,Self,将self.name.split替换为@name.split是同一件事吗 class Person attr_accessor :name def initialize(name) @name = name end def normalize_name self.name.split(" ").collect{|w| w.capitalize}.join(" ") end end 是的,它具有相同的结果,因为您定义了一个attr\u访问器,它为您提供g
class Person
attr_accessor :name
def initialize(name)
@name = name
end
def normalize_name
self.name.split(" ").collect{|w| w.capitalize}.join(" ")
end
end
是的,它具有相同的结果,因为您定义了一个
attr\u访问器
,它为您提供getter和setter方法
class Person
def name
@name
end
def name=(str)
@name = str
end
end
因此,您可以使用self
receiver调用函数name
,但如果您从类中删除了attr\u访问器
,则无法使用self.name
获取name
的值
class Person
def initialize(name)
@name = name
end
def normalize_name
self.name.split(" ").collect{|w| w.capitalize}.join(" ")
end
end
p = Person.new('John Doe')
p.normalize_name
NoMethodError: undefined method `name' for #<Person:0x00557e98300f68 @name="John Doe">
班级人员
def初始化(名称)
@name=name
结束
def规范化_名称
self.name.split(“”).collect{w | w.capitalize}.join(“”)
结束
结束
p=新的个人('John Doe')
p、 规范化名称
NoMethodError:的未定义方法“name”#
使用@foo
与self.foo
的一个警告是,如果您将@foo
键入类似@fooo
的内容,您将得到一个空值,但self.fooo
将告诉您该方法未定义。较新的ruby版本可能会在@foo
被设置之前就给你一个警告,并且警告被打开。另一个警告是,你可以在self.foo
中添加条件/保护/特殊操作/跟踪等,所有这些都会被@foo
忽略。例如,如果您决定无论何时设置人名
,您也会将信息发送到人口普查局
,但您忘记了有一个地方您使用了@name=…
而不是self.name=…
,然后,census\u bureau
一旦发现它没有你承诺的所有数据,可能会生气。始终使用self.name
,除了内部访问器本身是一种良好的做法;当你知道你故意想避开警卫时,你可以放松一下,但要评论一下!