我正在學習 Ruby on Rails 的 attr_accessor 的實際功能。在下面的示例中,我知道它將同時生成“name”和“name=”方法。其中,我可以測驗“name=”的實際效果,但是即使我去掉attr_accessor的整行,也不影響我獲取“name”的引數值。換句話說, attr_getter 實際上什么都不做。
但這在理論上是錯誤的,我該如何糾正這種錯誤的看法?
class HelloWorld
attr_accessor :name
def initialize(name = "Old name")
@name = name
end
def hello
puts "Hello, I am #{@name}"
end
def intro
puts "I name is #{@name}"
end
end
keaton = HelloWorld.new()
keaton.name = "New name"
keaton.hello #=> Hello, I am New name
keaton.intro #=> I name is New name
uj5u.com熱心網友回復:
正如評論中提到的那樣,它與 Rails 無關,它是 Ruby 核心的一部分。
@name只是一個實體變數,僅在HelloWorld. 當您洗掉時,attr_accessor :name您將無法@name從外部讀取或寫入(實際上您可以使用instance_variable_getand instance_variable_set。但是您真的需要它嗎?)
class HelloWorld
def initialize(name = "Old name")
@name = name
end
end
hello_world = HelloWorld.new
你讀不懂
hello_world.name
undefined method `name' for #<HelloWorld:0x00007f3125ea51e8 @name="Old name"> (NoMethodError)
你寫不出來
hello_world.name= 'New name'
undefined method `name=' for #<HelloWorld:0x00007f3125ea51e8 @name="Old name"> (NoMethodError)
由您決定是否需要授予對變數的訪問權限。如果您只需要一個閱讀器,請使用attr_reader. 如果您想撰寫它,請使用attr_writer. 如果兩者都需要,只需將其保留為現在的attr_accessor.
uj5u.com熱心網友回復:
取決于你。
這在理論上并沒有錯。實際上,我們可以選擇如何處理程式代碼。我們在程式代碼中使用 OOP 概念。該程式的代碼在邏輯上是正確的。我認為您是在說您的代碼是正確的。
class HelloWorld
def setName(name = "Old name")
@name = name
end
def hello
puts "Hello, I am #{@name}"
end
def intro
puts "I name is #{@name}"
end
end
keaton = HelloWorld.new()
keaton.setName("New name")
keaton.hello
keaton.intro
#OUTPUT :
#Hello, I am New name
#I name is New name
您知道其他語言的屬性中的 get & set 方法。Get 方法回傳變數的值,并將 set 賦值給 name 變數
例如:在 C# 中,獲取屬性中的 set 方法
public class HelloWorld
{
private int _name;
public int Age
{
get { return _name; }
set { _name = value; }
}
}
紅寶石中的相同邏輯
class HelloWorld
attr_accessor :name
def initialize
@name = name
end
end
uj5u.com熱心網友回復:
我想我明白了,簡單地說:
- 原來的getter 和setter 分別定義了實體方法“name 和name=”。
# getter
def name
@name
end
# setter
def name=(value)
@name = value
end
- 即 is
def namenotdef self.name,所以它不是類方法。 attr_accessor允許class HelloWorld及其新實體使用實體方法“name and name=” 。- 方法“name and name=”的默認值是初始化的指定實體變數@name。
def initialize(name = "No name")
@name = name
end
- 方法 "hello" 和 "intro" 不能重新賦值(就像 setter 可以做的那樣),但可以有更豐富的輸出結果,比如句子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441496.html
標籤:轨道上的红宝石
