Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | 事前定義変数 例外、パターンマッチ、入出力変数

概要

事前定義変数について

詳細

Rubyで事前に定義されている定数は以下。

カテゴリ 変数名 内容
例外 $! raiseされた例外
例外 $@ スタックトレース
パターンマッチ $& パターンマッチ全体
パターンマッチ $+ マッチしたグループのうち、最後のもの
パターンマッチ $` マッチした箇所より前
パターンマッチ $' マッチした箇所より後
パターンマッチ $n nは数値。マッチしたグループ
入出力変数 $/ 入力レコードの区切り文字。デフォルトは\n
入出力変数 $\ printなどの頭に追加される文字列。デフォルトはnil
入出力変数 $, Kernel#printやArray#joinの引数間の文字。デフォルトはnil
入出力変数 $. 現在の入力ファイルから最後に読み込んだ行
入出力変数 $; splitのデフォルト区切り文字。デフォルトはnil
入出力変数 $ 標準入力から受け取ったファイル全体
入出力変数 $> printやprintfの出力先。デフォルトはSTDOUT
入出力変数 $_ Kernel#print,Kernel#readlineで読み取られた最後の行
入出力変数 $stdin 現在の標準入力
入出力変数 $stdout 現在の標準出力
入出力変数 $stderr 現在の標準エラー

サンプルコード

# encoding: UTF-8
require_relative "../open_classes.rb"
require 'pp'

def error_test(number, devide)
  begin
      number/devide
  rescue ZeroDivisionError
    print_eval "$!"
    print_eval "$@"
  end
end

puts "** error test **"
error_test 1,0

def match_test()
  "hg hage hige hoge" =~ /(hage)\s(hige)/
  print_eval "$&", binding
  print_eval "$+", binding
  print_eval "$`", binding
  print_eval "$'", binding
  print_eval "$1", binding
  print_eval "$2", binding
  print_eval "$3", binding
  print_eval "pp $~", binding
end

puts "----------------------------------------------------------"
puts "** match test **"
match_test

puts "----------------------------------------------------------"
puts "** io parameter test **"
print_eval "p $/"
print_eval "p $\\"
$\ = "output:"
print_eval "p $\\"
print_eval %Q|puts "test"|
$\ = nil

print "hage","hige","hoge","\n"
$, = "|"
print "hage","hige","hoge","\n"

print_eval "p $;"
$; = ","
print_eval %Q|"hoge,hige,hage".split.size|
$; = nil

print_eval "p $<"
print_eval "p $>"
print_eval "p $_"
print_eval "p $stdin"
print_eval "p $stdout"
print_eval "p $stderr"

puts "----------------------------------------------------------"
puts "** runtime test **"
print_eval "p $0"

出力

** error test **
($!) => divided by 0
($@) => C:/xxx/pre_reserve_word1.rb:7:in `/'
C:/xxx/pre_reserve_word1.rb:7:in `error_test'
C:/xxx/pre_reserve_word1.rb:15:in `<main>'
----------------------------------------------------------
** match test **
($&) => hage hige
($+) => hige
($`) => hg 
($') =>  hoge
($1) => hage
($2) => hige
($3) => 
(pp $~) => #<MatchData "hage hige" 1:"hage" 2:"hige">
hage hige
----------------------------------------------------------
** io parameter test **
(p $/) => "\n"

(p $\) => nil

(p $\) => output:"output:"
output:
(puts "test") => output:test

hagehigehoge
hage|hige|hoge|
(p $;) => nil

("hoge,hige,hage".split.size) => 3
(p $<) => ARGF
ARGF
(p $>) => #<IO:<STDOUT>>
#<IO:0x25d5140>
(p $_) => nil

(p $stdin) => #<IO:<STDIN>>
#<IO:0x25d5188>
(p $stdout) => #<IO:<STDOUT>>
#<IO:0x25d5140>
(p $stderr) => #<IO:<STDERR>>
#<IO:0x25d50f8>