2016-06-08 66 views
-1

這個問題關於Ruby中的setter和getter方法。在下面的例子中,我有三種方法。前兩個分別是獲取和設置實例變量@login_method。第三種是嘗試訪問setter方法的實例方法。它無法訪問setter方法,因爲當行login_method = 15運行時,對於放置在setter方法內的調試器語句,執行不會停止。 爲什麼我不能從方法mymeth中訪問setter方法?如果我將setter方法調用與「self」作爲前綴,我可以訪問它,但爲什麼我必須這樣做?如何從Ruby對象實例中的實例方法訪問setter和getter方法?

require 'byebug' 
class MyClass 
    def login_method 
    debugger; 
    @login_method 
    end 
    def login_method=(value) 
    debugger; 
    @login_method 
    end 
    def mymeth 
    debugger; 
    login_method = 15 
    end 
end 

obj = MyClass.new 
obj.mymeth 
+1

從[分配方法](http://ruby-doc.org/core-2.3.1/doc/syntax/assignment_rdoc.html#label-Assignment+Methods):_「當使用方法分配時,你必須始終有一個接收器,如果你沒有接收器,Ruby假定你正在分配給一個局部變量「_ – Stefan

回答

1

您的login_method=實例方法需要接收器。如果這不是對你很重要,你可以把它私人這應該做的伎倆

private 

def login_method=(value) 
    debugger; 
    @login_method 
end 
+1

爲什麼getter方法有關? – sawa

+0

因爲我很明顯錯過了方法:D – Ursus

1

試試這個:

class MyClass 
    def login_method 
    @login_method 
    end 
    def login_method=(value) 
    @login_method = value 
    end 
    def mymeth 
    self.login_method = 15 
    end 
end 

obj = MyClass.new 
obj.mymeth 
puts obj.login_method 

你也可以這樣做:

class MyClass 
    attr_accessor :login_method 

    def mymeth 
    self.login_method = 15 
    end 
end 

obj = MyClass.new 
obj.mymeth 
puts obj.login_method 
+0

OP知道它和'self'一起工作,問題是「爲什麼?」 – Stefan

+0

好吧,是這樣的,也是那個setter方法是錯誤的:它沒有賦值 –

相關問題