Ruby语法,语义问题def status =(status)

时间:2013-05-07 00:43:09

标签: ruby-on-rails ruby

我正在查看此代码,并试图找出def status=(status)的含义。我以前从未见过。

class Tweet
attr_accessor :status

def initialize(options={})
self.status = options[:status]
end

def public?
self.status && self.status[0] != "@"
end

def status=(status)
@status = status ? status[0...140] : status
end
end

3 个答案:

答案 0 :(得分:4)

这是一个setter - 当你说thing.status = whatever时要调用的方法。

如果没有这样的方法,说thing.status = whatever将是非法的,因为该语法只是用于调用setter的语法糖。

答案 1 :(得分:4)

我会以外行的方式回答这个问题,因为我在开始时并不理解这一点。

假设您希望Tweet类具有属性status。现在你要改变那个属性,你不能,因为它隐藏在类中。您可以与类中的任何进行交互的唯一方法是创建一个方法来执行此操作:

def status=(status)
  @status = status # using @ makes @status a class instance variable, so you can interact with this attribute in other methods inside this class
end

大!现在我可以这样做:

tweet = Tweet.new
tweet.status = "200" # great this works
# now lets get the status back:
tweet.status # blows up!

我们无法访问status变量,因为我们尚未定义执行此操作的方法。

def status
  @status # returns whatever @status is, will return nil if not set
end

现在tweet.status也可以。

有一些简介:

attr_setter :status #like the first method
attr_reader :status # like the second one
attr_accessor :status # does both of the above

答案 2 :(得分:1)

这意味着def foo 总是意味着完全相同:定义名为foo的方法。

def initialize

定义名为initialize的方法。

def public?

定义名为public?

的方法
def status=

定义名为status=

的方法

就是这样。这里绝对没什么特别的。定义名称以=符号结尾的方法时没有魔力。

调用一个名称以=符号结尾的方法时,会发生魔力。基本上,您可以在=符号和方法名称的其余部分之间插入空格。所以,而不是像这样调用这个方法

foo.status= 42

您可以这样称呼它:

foo.status = 42

这使它看起来像一个任务。注意:它也被视为另一种方式的赋值;就像所有其他形式的赋值一样,赋值表达式求值为赋值,这意味着在这种情况下,方法的返回值忽略