7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

第六回

Last updated at Posted at 2020-12-22

variable

今回は変数とメソッドについて取り扱っていきます

Theme

受け取った引数ARGV[0]をnameという変数に代入してそれを打ち出すプログラムを作る.

> ruby name_variable.rb Ruby
Ruby

解説

 rubyにおける変数はC言語のように型宣言する必要がないので,以下のように記入すればよい.

name='Ruby'

変数の種類

Rubyには,以下のように様々な変数が存在します.

・ローカル変数・定数・グローバル変数・ブロック変数・インスタンス変数・クラス変数・クラスインスタンス変数

ローカル変数   

 解説に載っていた変数です.一番よくつかわれます.

宣言

変数名には英数字と_(アンダーバー)を使うことができます.先頭には数字を使うことはできず,宣言と初期化を同時に行う必要があります.

name="Ruby"    #ok
name_1="Ruby"  #ok

2_name="Ruby"  #NG  ->SyntaxError

name           #NG ->NameError

スコープ 

 メソッド,クラスなど定義された場所の範囲内でのみ使用可能.クラスやメソッドを超えての参照はできず,定義された場所以外から参照をするとエラーになる.

定数

宣言

ルールはローカル変数と同じだが,定数は全て大文字で宣言する.最初の文字だけ大文字にする「キャメルケース」はクラス名などに用いられる.

NAME="ruby"
Name="ruby" #クラス名と紛らわしいので定数としては使われない

スコープ

定義されたクラスやモジュール内やクラスを継承しているクラスなどで参照できる.

RUBY=2.78

puts RUBY
2.78

クラス内で定義可能なので同じ定数名でもクラスごとに違う値をもつことができる.

グローバル変数

宣言

変数名の一番初めに"$"をつけないといけない.

$name="ruby"

スコープ

ローカル変数の逆で,メソッドやクラスを超えて参照できる変数.定義した場所にとらわれず,プログラムのどこからでも参照や変更ができる.

$name="ruby"

def greet
 p $name
end

greet
"ruby"

ブロック変数

宣言

ブロック内「{}(ブレース)もしくはdo ~ end 内」で「|」で囲むことで宣言できる.


#複数行でまとめる場合
3.times do |i,x| 
end

#1行でまとめる場合
[1,2,3].inject {|sum, n| sum+n}

スコープ

ブロック実行の時にブロック内で用いられる一時的な変数.繰り返しなどの処理を行う際,「ブロック変数」に値を代入しながら処理を行う.ブロック内からのみ参照可能.

num=99
3.times do |i, x=num|
 num=i*10 
 p x 
end
10

インスタンス変数

宣言

変数の始めに「@」をつける.

@name="ruby"

スコープ

インスタンスメソッド内でのみ使用できる変数.インスタンスごとに異なる値を持つことができ,メソッドを超えて参照することができる.

class User
 def initialize(name)
  @name=name
 end

 def put_name
  p @name
 end
end

user1=User.new("ruby")
user2=User.new("python")
user1.put_name
user2.put_name

"ruby"
"python"

クラス変数

宣言

変数のはじめに「@@」をつける.

@@name="ruby"

スコープ

定義されたクラス内で共有する値を扱うことができる変数.他のインスタンスで使用しても同じクラス内であれば共通の値として扱われるので,クラス内では一つの値しか扱えない.クラスを継承したクラスからも参照できる.

class Ruby
 @@number=1
 def foo
  puts @@number
 end
end

num=Ruby.new
num.foo
1
class Jewelry < Ruby
 def hoge
  puts @@number
 end
end

num2=Jewelry.new
num2.hoge
1

このように,Rubyクラスを継承したJewelryクラスでもクラス変数にアクセスできていることが分かる.

クラスインスタンス変数

宣言

インスタンス変数と同じく「@」で始まるが,定義される場所によりインスタンス変数と区別される.

@class_instance_var="ruby"

スコープ

クラス変数と同様,クラス内で定義し,定義されたクラス内でしか参照することができない.

インスタンス変数と同じく@で始まるが,クラスで定義されている場合はクラスインスタンス変数,インスタンス内で定義されている場合はインスタンス変数と定義されている場所で区別される.クラスを継承したクラスからは参照できないのがクラス変数との違い.

class MyClass
 @class_instance_var="ruby"
 def sef.class_instance_var
  puts @class_instance_var
 end

 def class_instance_var
  puts @class_instance_var 
 end
end

instance=MyClass.new
instance.class_instance_var

インスタンスメソッド内では,インスタンス変数として認識されるので,クラスインスタンス変数にはアクセスできないことが分かる.

 class MyClass
  @class_instance_var="ruby"
  def self.class_instance_var
   puts @class_instance_var
  end
  def class_instance_var
   puts @class_instance_var
  end
end

MyClass.class_instance_var
ruby

クラスメソッドの場合はクラスインスタンス変数にアクセスできる.

class SubClass < MyClass
 def self.class_instance_var_again
  puts @class_instance_var
 end
end

SubClass.class_instance_var_again

継承したクラスからはクラスインスタンス変数にアクセスできない.

参考文献

https://www.sejuku.net/blog/12879


  • source ~/grad_members_20f/members/NobuakiMori/L06_method.org
7
0
0

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
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?