def current_user=(user) @current_user = user end
不明白为什么这样做,能稍微讲解一下?感谢了!!!
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/)
这里是赋值方法,可以带 =
!
?
感觉楼上的回答都没有针对楼主的问题。
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)
#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
#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>'
一、Ruby 的方法呼叫,常常會適時的省略小括號:
例如
def say_hi_to(name)
puts "hi, #{name}"
end
say_hi_to("eddie")
但我們通常會寫成:
say_hi_to "eddie"
把小括號省略了,這在 Ruby 是很常見的寫法
二、Ruby 並沒有「屬性」(property/attribute) 這樣的東西:
class Girl
def initialize(age)
@age = age
end
end
little_girl = Girl.new(25)
雖然這個 little_girl 看起來好像有 @age
變數,但不代表它是可以直接存取的屬性。硬是要用 little_girl.age
問她年紀,或是要用 little_girl.age = 18
設定她的年紀,她都會賞你一巴掌,給你錯誤訊息的。
little_girl.age
你以為是讀取 little_girl 上的 age 屬性,但事實上是 little_girl.age()
方法,只是小括號被省略了。little_girl.age=18
你以為是設定 little_girl 的 age 屬性,但事實上是 little_girl.age=(18)
方法,只是小括號被省略了。
說穿了 Ruby 一堆東西都是方法!
你以為 1 + 2 是簡單的數學運算嗎?其實它是 1.+(2)
,它是對數字物件 1 送了一個 +
的訊息,並且把數字物件 2 當做參數傳給它
好啦,即然知道它們都是方法,那要怎麼定義它們呢?
class Girl
def initialize(age)
@age = age
end
# 因為它會取得 instance var,故又稱之 getter
def age
return @age # 這邊的 return 通常也會省略
end
# 因為它會設定 instance var,故又稱之 setter
def age=(new_age)
@age = new_age
end
end
請把等號當做一般的字母看待,等號可以是方法名字的一部份
這個方法就叫做 age=
,要呼叫它就是用 age=(18)
,沒錯,就是連等號一起呼叫。
所以,標準形態應該長這樣:
little_girl.age=(18)
但因為上述第一項,Ruby 可以省略小括號,所以可寫成:
little_girl.age=18
然後,Ruby 又有幫忙加了一些語法糖衣,讓你在中間加一些空白字元也是可以的:
little_girl.age = 18
最後就會讓你看起來像是在設定 age 屬性了。
如果你懶得寫這樣的 getter/setter,可用 attr_reader
、attr_writer
或 attr_accessor
來替你產生 getter/setter。
不知道這樣回答有沒有讓樓主清楚一些 :)
若有錯再請不吝指正