Ruby:类定义中的self关键字

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

将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访问器
,它为您提供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
,除了内部访问器本身是一种良好的做法;当你知道你故意想避开警卫时,你可以放松一下,但要评论一下!