你能舉個例子嗎?Ruby中的方法和屬性有什麼區別?
回答
屬性是對象的特定屬性。方法是對象的功能。
在Ruby中,所有實例變量(屬性)默認都是私有的。這意味着您無法在實例本身的範圍之外訪問它們。 訪問屬性的唯一方法是使用訪問器方法。
class Foo
def initialize(color)
@color = color
end
end
class Bar
def initialize(color)
@color = color
end
def color
@color
end
end
class Baz
def initialize(color)
@color = color
end
def color
@color
end
def color=(value)
@color = value
end
end
f = Foo.new("red")
f.color # NoMethodError: undefined method ‘color’
b = Bar.new("red")
b.color # => "red"
b.color = "yellow" # NoMethodError: undefined method `color='
z = Baz.new("red")
z.color # => "red"
z.color = "yellow"
z.color # => "yellow"
因爲這是一個非常commmon行爲,Ruby提供了一些方便的方法來定義存取方法:attr_accessor
,attr_writer
和attr_reader
。
屬性只是一個捷徑。如果你使用attr_accessor
創建一個屬性,Ruby只是聲明一個實例變量併爲你創建getter和setter方法。
既然你問了一個例子:
class Thing
attr_accessor :my_property
attr_reader :my_readable_property
attr_writer :my_writable_property
def do_stuff
# does stuff
end
end
這裏是你如何使用類:
# Instantiate
thing = Thing.new
# Call the method do_stuff
thing.do_stuff
# You can read or write my_property
thing.my_property = "Whatever"
puts thing.my_property
# We only have a readable accessor for my_readable_property
puts thing.my_readable_property
# And my_writable_propety has only the writable accessor
thing.my_writable_property = "Whatever"
我認爲這比答案的答案要好得多... – 2011-11-24 16:30:32
嚴格地說,屬性是類實例的實例變量。更一般地說,屬性通常使用attr_X類型方法來聲明,而方法只是簡單地聲明。
一個簡單的例子可能是:
attr_accessor :name
attr_reader :access_level
# Method
def truncate_name!
@name = truncated_name
end
# Accessor-like method
def truncated_name
@name and @name[0,14]
end
# Mutator-like method
def access_level=(value)
@access_level = value && value.to_sym
end
的區別這兩者之間是用Ruby有點武斷,因爲是專門提供給他們沒有直接聯繫。這與C,C++和Java等其他語言形成鮮明對比,其中對象屬性和調用方法的訪問是通過兩種不同的機制完成的。特別是Java的accessor/mutator方法被拼寫出來,而在Ruby中,這些方法都是用名字來隱含的。
在例子中,通常情況下,「屬性訪問器」和提供基於屬性值的數據的實用程序方法(如truncated_name)之間的區別很小。
class MyClass
attr_accessor :point
def circle
return @circle
end
def circle=(c)
@circle = c
end
end
屬性是對象的屬性。在這種情況下,我使用attr_accessor類方法定義:point屬性以及用於point的隱式getter和setter方法。
obj = MyClass.new
obj.point = 3
puts obj.point
> 3
方法'circle'是一個顯式定義的@circle實例變量的getter。 'circle ='是@circle實例變量的明確定義的setter。
我聽說「屬性」這個詞在Ruby特定的圈子中引用了任何不帶參數的方法。
class Batman
def favorite_ice_cream
[
'neopolitan',
'chunky monkey',
'chocolate',
'chocolate chip cookie dough',
'whiskey'
].shuffle[0]
end
end
在上面,my_newest_batman.favorite_ice_cream將是一個屬性。
- 1. 屬性和屬性有什麼區別?
- 2. 發佈的和公共的方法/屬性有什麼區別?
- 3. NavigationService.Navigate()方法和PhoneApplicationFrame.Source屬性有什麼區別?
- 4. 使用方法和屬性有什麼區別?
- 5. notable_for和notable_types屬性有什麼區別?
- 6. 「wairole」和「role」屬性有什麼區別?
- 7. Ruby和Ruby on Rails有什麼區別?
- 8. ember.js中'[]'屬性和'@each'屬性有什麼區別?
- 9. 算法和方法有什麼區別
- 10. Ruby中STDIN和$ stdin有什麼區別?
- 11. Ruby的dup和clone方法有什麼區別?
- 12. ruby有什麼區別self.method和類內的方法<< self
- 13. 在Ruby中,類方法和類的單例方法有什麼區別?
- 14. Java註釋:屬性還是方法?有什麼區別
- 15. GET和POST方法有什麼區別?
- 16. UrlHelper.Route和UrlHelper.Link方法有什麼區別?
- 17. 方法和協議有什麼區別
- 18. 方法`toHaveBeenCalled()`和`andCalledThrough()`有什麼區別?
- 19. nibNameOrNil和ViewDidLoad方法有什麼區別?
- 20. browser.sleep()和browser.wait()方法有什麼區別?
- 21. title屬性和tooltip屬性有什麼區別?
- 22. Python中的string方法和str方法有什麼區別?
- 23. Ruby on Rails和Grails有什麼區別?
- 24. 設置onClickListener和製作xml android:onclick屬性相關的方法有什麼區別?
- 25. 腳本標籤中的「lang」和「type」屬性有什麼區別?
- 26. HTML中的onBlur和onChange屬性有什麼區別?
- 27. .net中的readonly屬性和函數有什麼區別?
- 28. 本練習中substr方法和slice方法有什麼區別?
- 29. 角色,隸屬關係和屬性之間有什麼區別?
- 30. @JsonIgnore屬性和沒有註解的屬性之間有什麼區別?
您可以隨時使用Object.instance_variable_get(:@ symbol)訪問變量,該變量繞開了定義訪問器的需要。 – 2009-07-28 14:57:54