map
Perl
use strict;
use Data::Dumper;
my @x;
my @y = map { $_ * 2} @x;
print Dumper @y;
結果:なにも表示されない
Ruby
定義されてない系エラー
x;
y = x.map{|o| o * 2}
p y
結果:
r.rb:1:in
<main>': undefined local variable or method
x' for main:Object (NameError)
nil系エラー
x = nil;
y = x.map{|o| o * 2}
p y
結果:
r.rb:2:in
<main>': undefined method
map' for nil:NilClass (NoMethodError)
解決
x = nil
y = (x||[]).map{|o| o * 2}
p y
結果:
[]
こっちはエラー内容変わらず
x
y = (x||[]).map{|o| o * 2}
p y
x と x=nilの違い
x
エラーメッセージを読むに、main:Object
らしい。
(下のほう書いてて思ったがこれは違うな)
x = nil
エラーメッセージを読むに、nil:NilClass
らしい。
インスタンス変数だと?
class Hoge
attr_accessor :foo
def initialize()
@foo
end
end
hoge = Hoge.new()
hoge.foo.map {|o| o * 2}
結果:
r.rb:7:in
<main>': undefined method
map' for nil:NilClass (NoMethodError)
hoge.foo
はnil:NilClass
らしい。 なんで??
class Hoge
attr_accessor :foo
def initialize()
@foo
end
end
hoge = Hoge.new()
p (hoge.foo||[]).map {|o| o * 2}
結果:
[]
インスタンスメソッドで呼ぼうとやっぱりNilクラス
class Hoge
attr_accessor :foo
def initialize()
@foo
end
def double
@foo.map{|o| o * 2}
end
end
hoge = Hoge.new()
hoge.double
インスタンスメソッドで存在しない変数を使うと?
class Hoge
def double
bar.map{|o| o * 2}
end
end
hoge = Hoge.new()
hoge.double
結果:
r.rb:3:in
double': undefined local variable or method
bar' for #Hoge:0x007f964c1152d0 (NameError)
from r.rb:8:in `'
動作からわかること
初期化されていない インスタンス変数を参照した時の値はnilです。
初期化されてないただの変数はmain:Object
の定義されてない変数??