Help us understand the problem. What is going on with this article?

RubyとPerlの違い

More than 5 years have passed since last update.

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 methodx' for main:Object (NameError)

nil系エラー

x = nil;
y = x.map{|o| o * 2}
p y

結果:

r.rb:2:in <main>': undefined methodmap' 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 methodmap' for nil:NilClass (NoMethodError)

hoge.foonil: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 methodbar' for #Hoge:0x007f964c1152d0 (NameError)
from r.rb:8:in `'

動作からわかること

変数と定数 (Ruby 1.9.3)

初期化されていない インスタンス変数を参照した時の値はnilです。

初期化されてないただの変数はmain:Objectの定義されてない変数??

shingo-nakanishi
https://www.clear-lesson.com/
https://www.clear-lesson.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away