新手问题 定义方法后面加 “=”,意义是什么?

drine · 发布于 2015年03月13日 · 最后由 suupic 回复于 2015年03月15日 · 1581 次阅读
6494

def current_user=(user) @current_user = user end

不明白为什么这样做,能稍微讲解一下?感谢了!!!

共收到 19 条回复
6494

网上找了下现有的资料看了,但还是没明白这么做的意义到底体验在何处。

14358

getter setter

本质作用就是各种赋值、取值的事件hook

9442
class AttrReader
  attr_reader :attr_ar
end
p AttrReader.new.methods.grep(/attr/)

class AttrWriter
  attr_writer :attr_aw
end
p AttrWriter.new.methods.grep(/attr/)

class Attr
  attr_accessor :attr
end
p Attr.new.methods.grep(/attr/)

这里是赋值方法,可以带 = ! ?

7294

楼主的例子中,定义方法是为了封装@current_user,不要暴露实例变量

6494

#5楼 @loveltyoic 我想知道调用这个方法的时候调用过程是什么样的..

96

就是java里面的setter

6494

看了上面的回答..感觉理解起来还是有点力不从心 :(

7294

#6楼 @drine

current_user = User.find(params[:user_id])
6494

#9楼 @loveltyoic 谢谢,再试着理解下.

207

感觉楼上的回答都没有针对楼主的问题。

def current_user=(user)
  @current_user = user
end

current_user = some_value

先理解方法签名:def current_user=(user) 这行其实意思是 def set_current_user(user) ,只不过方法名里面有个等号,这个方法名并不是 current_user 然后一个等号有什么特殊含义,而是整个方法名就是 current_user=

虽然方法名里面的等号并无特异之处,但是在调用的时候 Ruby 解释器会有一些特殊的处理。

这个方法定义后,一旦出现这样的赋值: current_user = some_value

Ruby 解释器会寻找 current_user= 方法,找到了就会调用之。你说 current_user= 中间有个空格,方法名对不上。没错,这就是刚说的特殊处理。赋值语句首先会去找一个 赋值号左侧内容= 这个名字的方法,这个方法一般称为 setter,找到了就调用,找不到,就创建一个名称为赋值号左侧内容的变量进行赋值,也就是正常赋值。

如果不使用这个 Ruby 的约定,可以这样改写:

def set_current_user(user)
  @current_user = user
end

set_current_user(some_value)
1

楼主没有清楚表达他不明白哪一点,所以回复的人从 Ruby 基础到架构设计都回答了一轮,然后楼主觉得哇怎么这么深奥。

207

#12楼 @Rei 我觉得他已经表达清楚了,题目里就问的是针对方法名后面的=

8

#11楼 @blacktulip 其实以等号结尾的方法有特殊处理:

def current_user=(user)
  @xx = user
  nil
end

和下面不一样

def set_current_user(user)
  @xx = user
  nil
end

current_user(user) 的返回值永远是user set_current_user(user) 的返回值是nil

207

#14楼 @hooooopo 果然是这样,谢谢指正。我测试了一下,带等号的方法只能接受一个参数,这应该也是个特殊处理。这种方法的返回值永远是接受的那个参数,我猜测。

def current_user=(user, another)
  @current_user = user + another
  nil
end

current_user=("test", "other")
=>
SyntaxError: syntax error, unexpected ',', expecting ')'
current_user=("test", "other")
                     ^
    from /Users/blacktulip/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
1553

#16楼 @eddie 赞,有老师上课的风范

6494

#16楼 @eddie 这么讲就清晰很多啦!谢谢楼上各位~!

145

@eddie 很赞

23196 Catherine 关于以=结尾的方法 中提及了此贴 09月30日 09:13
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册