2017-09-30 3 views
0

私はnoob question.Please attr_accessorを実装するために、以下のルビープログラムの出力を教えてください。attr_accessorの実装

class SimpleService 

     attr_accessor :name 

     def initialize(name) 
      @name = name 
     end 

     def process 
      if false # some condition met 
      name = 'Akshay' 
      end 
      name 
     end 
     end 

私はこのクラス

 SimpleService.new('John Doe').process 
     => nil 

はなぜ結果nilで実行?

私は

def process 
     if false # some condition met 
      self.name = 'Akshay' 
     end 
     name 
     end 

に名前を明示的に自己を使用して今すぐ出力は

SimpleService.new('John Doe').process 
    => "John Doe" 

なぜ結果が今、 "ジョン・ドウ" である?ありますか

私はルビーの初心者です。

ありがとうございます!

+0

@jörg-w-mittag私はこれに同意しません。この疑問は、なぜ 'if false'の下で明示的な受信機を使うと、何らかの手段で高い受信者_を必要としない戻り値の振る舞いを変更する理由です。 – mudasobwa

答えて

1

name =を呼び出すと、新しいローカル変数が暗黙に宣言されます。これを試してみてください:

def process 
    name = 'Akshay' 
    puts local_variables.inspect 
end 

なぜそれが複雑な質問で、何度もここやここで議論しています。設定者は常に明示的な受信者が必要です。期間。

あなたはメソッド内の行name = 'Akshay'を持っていたら、新しいローカル変数を紹介し、この方法の適用範囲は、宣言された方法をもかかわらず、新しいローカル変数nameで拡張されます。これは基本的にルビーパーサーによって行われます。

ローカル変数はインスタンスメソッドよりも優先されます。そのため、最終行に返されるのはローカル変数です。それは明らかに上記の虚偽の状態のために設定されていませんでした。従ってnil