LoginSignup
2
2

More than 5 years have passed since last update.

RubyとPerlの違い

Last updated at Posted at 2015-10-30

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の定義されてない変数??

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2