I recently read a blog post about Ruby's behavior regarding a local variable that obscures a method (differently, for example, a block variable that obscures a local variable of a method , which is also mentioned in this StackOverflow thread ), and I found some behavior that I don’t quite understand .
A Ruby document states that :
[V] valid and method names are almost identical. If you have not assigned one of these ambiguous names, Ruby will assume that you want to call the method. After you have assigned the name Ruby, it is assumed that you want to refer to a local variable.
So, given the following class example
class Person
attr_accessor :name
def initialize(name = nil)
@name = name
end
def say_name
if name.nil?
name = "Unknown"
end
puts "My name is #{name.inspect}"
end
end
, , :
name.nil?
name
, attr_accessor
- Ruby
name = "Unknown"
#say_name
, name
, , - ,
Person
name
, , name
, #say_name
, nil
, irb
:
irb(main):001:0> require "./person.rb"
true
irb(main):002:0> Person.new("Paul").say_name
My name is nil
nil
irb(main):003:0> Person.new.say_name
My name is "Unknown"
nil
, Pry, , name
, :
irb(main):002:0> Person.new("Paul").say_name
From: /Users/paul/person.rb @ line 13 Person
10: def say_name
11: binding.pry
12:
=> 13: p name
14: if name.nil?
15: name = "Unknown"
16: end
17:
18: puts "My name is #{name.inspect}"
19: end
[1] pry(#<Person>)> next
"Paul"
, , , name
. , name
...
From: /Users/paul/person.rb @ line 14 Person#say_name:
10: def say_name
11: binding.pry
12:
13: p name
=> 14: if name.nil?
15: name = "Unknown"
16: end
17:
18: puts "My name is #{name.inspect}"
19: end
[2] pry(#<Person>)> name
nil
Err... . name
, , , , ... , - name = "Unknown"
, ...?
[3] pry(#<Person>)> exit
My name is nil
nil
, , . , ?
name.nil?
, name
? ?- , Pry?
- - ?
:
➜ [ruby]$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
- ( ) , , .
- , , .
- , - , , ,
self.name
name()
.
, , Pry. Person.new("Paul").say_name
:
From: /Users/paul/person.rb @ line 13 Person#say_name:
10: def say_name
11: binding.pry
12:
=> 13: p name
14: if name.nil?
15: name = "Unknown"
16: end
17:
18: puts "My name is #{name.inspect}"
19: end
p
, , Pry, name
:
[1] pry(#<Person>)> name
nil
, , Ruby , , , . p
...
[2] pry(#<Person>)> next
"Paul"
... name
, .
, ? - ? , Pry name
, , Ruby name
?