:pぴー.sendせんど(:pぴー, :pぴー)

mokoaki
mokoriso@gmail.com

2017/07/22

変数、定数、予約語、演算子関係

Ruby技術者認定試験の書籍写経メモ

組み込み定数

ARGV 起動時の引数 argument vector
ARGF 仮想ファイルを表すオブジェクト
ENV 環境変数
STDIN 標準入力
STDOUT 標準出力
STDERR 標準エラー出力
DATA __END__ 以降をgetsできたりする

環境変数

RUBYOPT

コマンドライン起動時のオプションを指定しておける

コマンドライン起動時のオプション

ruby [オプション] -- ファイル名 [ARGV]

-c 文法チェック

$ ruby -c temp1.rb
Syntax OK

-e ワンライナー

$ ruby -e "p 2 ** 10"
1024

-W0 -W1 -W2(W) 冗長出力モード 右ほど冗長 -w1がデフォルト

-I(アイ) $LOAD_PATH 追加

$ ruby -I . temp1.rb

-r スクリプト実行前に指定されたファイルを実行する

$ ruby -r ./temp2.rb temp1.rb

-d デバックモード

# 現在の値を確認
$ echo $RUBYOPT

# cはダメっぽい そりゃそうだ

$ export RUBYOPT=-c
$ ruby temp1.rb
ruby: invalid switch in RUBYOPT: -c (RuntimeError)

RUBYLIB ライブラリ検索パス

# 現在の値を確認
$ echo $RUBYLIB

$ export RUBYLIB=/the/path/you/
$ ruby temp1.rb

特殊変数

頭が$

$: $LOAD_PATH
$* ARGV
$_ 最後にgetsかreadlineで読み込んだ文字列
$~[n] 最後に成功したマッチに対する結果
$` マッチした部分より前の文字列
$& マッチした部分
$’ マッチした部分より後の文字列
$+ マッチした最後のキャプチャ
$1, $2.. マッチしたn番目のキャプチャ
$? 最後に終了した子プロセス
$! 直近で補足した例外オブジェクト
$@ バックトレース
$0 実行中のプログラムファイル名

ローカル変数

グローバル変数

インスタンス変数

クラス変数

class Moko1
  @@v1 = 1

  def v1
    @@v1
  end

  def v1=(value)
    @@v1 = value
  end
end

class Moko2 < Moko1
end

moko1 = Moko1.new

moko1.v1
=> 1

moko2 = Moko2.new

moko2.v1
=> 1

moko2.v1 = 100

moko1.v1 = 100
=> 100
class Moko1
  @@v1 = 1

  def v1
    @@v1
  end
end

class Moko2 < Moko1
  @@v1 = 2
end

moko1 = Moko1.new

moko1.v1
=> 2

moko2 = Moko2.new

moko2.v1
=> 2

定数

再定義時の警告

 A = 1
=> 1

A = 2
warning: already initialized constant A
warning: previous definition of A was here
=> 2

メソッドは複数回実行が前提なので定数の初期化、更新は許されていない

def moko
  A = 3
end
#=> SyntaxError: (irb): dynamic constant assignment
HAGE = 'abcde'
=> "abcde"

HAGE.upcase!
=> "ABCDE"

HAGE
=> "ABCDE"

重要なので何度でも言うぞ

moko
NameError: undefined local variable or method 'moko'

if false
  moko = 1
end

moko
#=> nil
> hage
NameError: undefined local variable or method 'hage'

> hage.to_s
NameError: undefined local variable or method 'hage'

> hage = hage.to_s
#=> ""

疑似変数

true TrueClassクラスの唯一のインスタンス
false FalseClassクラスの唯一のインスタンス
nil NilClassクラスの唯一のインスタンス
self 現在のオブジェクト
__FILE__ 現在実行しているプログラムファイル名 $0とは微妙に違ったりする
__LINE__ 現在実行しているプログラムの行番号
__ENCODING__ 現在のソースファイルのエンコーディング

演算子

演算子の優先順位

::          
[]          
+(単項) ! ~      
**          
-(単項)          
* / %      
+ -        
<< >>        
&          
| ^        
> >= < <=    
<=> == === != =~ !~
&&          
||          
..        
?:(条件演算子)          
=(+=, -= …)          
not          
and or        

再定義できる演算子

| ^ &      
<=> == === =~    
> >= < <=    
<< >>        
+ - * / % **
~ +@ -@      
[] []=        
` ! != !~    

二項演算子

obj + other

def +(other)
end

単項プラス/マイナス

+obj

def +@
end

要素代入

obj.foo = value

def foo=(value)
end

[]

obj[key]

def [](key)
end

obj[key] = value

def []=(key, value)
end

obj[key, key2] = value

def []=(key, key2, value)
end

バッククォート記法

arg または %x(arg)

def `(arg)
end

再定義できない演算子

::                         スコープ演算子
=                         代入演算子
? :                         条件演算子
.. ...                       範囲演算子
&& || and or not                 論理演算子
+= -= *= /= %= **= &= |= ^= <<= >>= &&= ||= 自己代入演算子
@or = 1
=> 1

@or += 1
=> 2
def and(n)
  n * 2
end

p self.and('homo')
"homohomo"
=> "homohomo"

p self.and 'homo'
"homohomo"
=> "homohomo"

p self and 'homo'
main
=> "homo"

予約語

BEGIN class ensure nil self when
END def false not super while
alias defined? for or then yield
and do if redo true __LINE__
begin else in rescue undef __FILE__
break elsif module retry unless __ENCODING__
case end next return until  

defメソッドなんてのも作れる

def def(n)
  p n * 2
end

self.def('homo')
=> "homohomo"

UFO演算子

1, 0, -1 を返すんだよね?でも、右辺、左辺どっちが大きい時に1を返すのか覚えてる?

2 <=> 1 #=> 1
1 <=> 1 #=> 0
1 <=> 2 #=> -1
左辺が大きい 1
一緒 0
右辺が大きい -1

左から順番に 1, 0, -1 もう覚えるしかない!