LoginSignup
0
0

More than 1 year has passed since last update.

Ruby 変数のスコープ レキシカルスコープ

Last updated at Posted at 2022-04-24

はじめに

RubyとJavaScriptの違いに手間取ったので備忘録

JavaScriptのコード

let sample = "tee"

const hello = () => {
  if(sample === "tee") {
    return "teeです"
  } else {
    return "該当しません"
  }
}

console.log(hello()) //出力結果 "teeです"

Rubyのコード

sample = "tee"

def hello
  if sample == "tee"
    return "teeです"
  else
    return "該当しません"
  end
end

puts(hello())

# 出力結果
# undefined local variable or method `sample'

JavaScriptでは関数の外側(レキシカルスコープ)の変数を参照可能です。
Rubyではできない。これちょっとひっかりました・・・
初めて学習した言語がJavaScriptだったので、JS基準で考えてしまいます。

追記

@kagilinn 様からコメントいただきましたありがとうございます。

先頭が小文字: ローカル変数. 代入されたメソッドの, 代入された場所以降
先頭が大文字: 定数. 代入されて以降, そのクラスに所属して広範囲で読み取れるが, 代入しなおすことができない
先頭が @: インスタンス変数. 実行されたオブジェクトに所属する.
先頭が @@: クラス変数. 実行されたクラスに所属する.
先頭が $: グローバル変数. 代入されて以降どこでも読み書き可能. 但し理由がない限り使わないほうが良い.

こうして文字にするとわかりやすいですね。

js
const sample = "hogehoge"

const sampleDef = () => {
  // 関数
}
rb
sample = "hogehoge"

def sample_def
 # 関数(メソッド)
end

このように同じ場所(JavaScriptでいうところのグローバルコンテキスト)で変数を定義したとしても
JSはグローバル変数として
Rubyはローカル変数として
定義される違いがあるのですね。

勉強になりました!!

0
0
4

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