rubyってどんなのだっけ1
最近使ってない言語って忘れますよね。1年ruby使ってなかったら完全に忘れました。ということでメモ。
- printは改行なし
- "a"はString.new("a")と同じ
- ruby -Ku hoge.rbとかするとutf-8として実行できる($KCODEを変えている)
- windowsだと表示がshift-jisだったりするので, require "kconv"; print(kconv.tosjis("a"))とかしなければならない
- ""は\nとかが認識されるが、''はすべてタダの文字列として扱われる(\'と\\だけは別)
- %Q[あ"い"う]を使えば""を表せる("をいちいちエスケープしなくてよい)。%qは''を表す
- 下記のようにヒアドキュメントが書ける
str = <<"EOS" # <<と"EOS"の間にスペース要らない。 hoge hoge EOS
- name = "Tokyo"; print("出身は#{name}です。1+2=#{1+2}") このように式展開できる
- print "a" + "b" で文字連結
- print "ok!"*3 で指定数連結
- print "Tokyo" << " Japan"というように<<でStringの連結ができる。"a".concat("b")も同じ
- 数字は下記のように表す
Numeric -- Integer -- Fixnum(整数) | | | - Bignum(大きな整数) --Fixnumから自動的に切り替わる - Float --これらのクラスではnewメソッドは使えない
- 0b~, 0~, 0x~で2,8,16進数が表せる
- 2e3とか2e-3とかも使える
- 2_100_200とかで数値を見やすくできる
- &|^-<<>>などのbit演算子はすべて使える
- 変数には型はなく、ただのオブジェクトに対する名札(val=10; val="hello"もok)
- 変数は_と英数字しか使えない
- str1="Tokyo";str2=str1;str1="Osaka"ならstr1は"Osaka",str2は"Tokyo"。もしstr1 << "Hey!"だったらstr2は"TokyoHey!"になっている。前者はstr1が指すもの自体を張り替えただけ。後者はstr1が指し示すオブジェクトを変更している。
- num += 1なども使える
- 1/3.0は0.3333となる
- a,b,c=1,2とするなど、多重代入ができる(cはnilとなる). a,b,c=[1,2,3]もok
- PIなどのように大文字にすることでそれを定数とすることができる(変更できない)
- 下記のようにifが使える(もし条件式のあとに改行があるならばthenは省略できる(caseとかもみんなそう))
if a!=0 then print "hello" end
- falseとnilは偽であり、それ以外はすべて真となる
- ! && || and or not が使える
- 以下のようにelsifが使える
if hoge then print "hoge" elsif foo then print "foo" else print "hey" end
- 以下のようにunlessが使える(unlessにelsifはない)
unless hoge then print "hoge" else print "foo" end
- 以下のようにcaseが使える
case str when "foo" then print "foo" when "apple","banana","lemon" then #複数指定することが可能 print "fruit" else #elseで指定(なくても良い) print "hoge" end
- result > 60 ? "super" : "zako"などの三項演算子も使える
- print "hello" if debug など、後ろにifが付けられる
- 以下のようにwhileが書ける
while num < 2 do #条件式のあとに改行があればdoは省略できるよ print num,"\n" end
for num in 1..3 do #1..3のところはeachメソッドを持ったオブジェクト(配列やHash,範囲オブジェクトなど) print num,"\n" end
- "a".."z"などとしても範囲オブジェクトが作成できる(これはlastを含む)
- これらは実際にはRange.new(first, last)でも作成できる
- Range.new(first, last, true)とすればlastが抜ける
- Rangeオブジェクトはオブジェクト.succを使って更新している
"zz".succ -> "aaa" "4:5:9".succ -> "4:6:0" #数字が入っていたらそいつらだけ更新される
- 以下のようにeachが使える
(5..10).each{ |n| # eachやtimesのような{}ブロックを持つメソッドをイテレータという print n # {}はdo endにすることもできる } <|| >|ruby| 10.times{|n| print n} #0~オブジェクト-1まで走査
3.upto(7){|n| print n} #3,4,5,6,7まで走査(ちなみに|n|みたいなのは省略可能)
7.upto(3){|n| print n} #7,6,5,4,3まで走査
2.4.step(5.3, 0.8}{|n| print n} #2.4,3.2,4.0,4.8と走査
loop{ print "hello" } --無限ループ
- breakは一番内側の繰り返しだけ抜ける
- nextはいわゆるcontinueと同じ動作
- redoは現在の繰り返しをやりなおす
- num *= 2 while num < 1000 など、後ろからwhileとunitlを使うことができる
- a = ["山田", 1, 2]などと配列は違うオブジェクトを格納できる
- a[-1], a[-2]ができる。at(0)でも取得できる
- Array[1,2,3]と[1,2,3]は同じ
- Array.new(3)で[nil,nil,nil]が作れる
- Array.new(3, "hello")で["hello","hello","hello"]が作れる
- Array.new(3){|i| i*i} で[0,1,4]が作れる
- a = [1,2,3];b=a;c=Array.new(a)においてbとaは全く同じ場所をさすが、cは複製なのでa,bを変更しても影響はない
- a.length, a.sizeで配列の大きさが取れる
- 配列の要素がnilであるものを除いてカウントする場合はa.ntimesを使う
- a = [1,2,3]; a[5] = 3とするとa = [1,2,3,nil,nil,3]となる
- hash = {"a" => 1, "b" => 2, "c" => "3"} Hashクラス
- hash = Hash["a", 1, "b", 2]でも作れる(個数は偶数個でなければならない)
- hash["a"] or hash.fetch("a")でvalueが取り出せる(ただしfetchではミスったときにIndexErrorが起こる。前者ならnilとなる)
- hash.fetch("a", "none")でデフォルト値がnoneになる
- hash = Hash.new()で作れる
- h = Hash.new{|hash, key| hash[key] = "none"} においてこれはデフォルト値をnoneにしている
- hh = Hash[h] で複製ができる
- h = Hash.new("none")でデフォルト値がnoneとなる
- h.default = "none"でもよい
- h["a"] = 1で要素を追加
- h.store("a", 1)も同じ動作を示す
- h.size, h.lengthで大きさが取れる
- h.each{|k, v| print k,v,"\n"}, h.each_key, h.each_valueも存在する
- h.keys, h.valuesでそれらを配列として取り出せる
- h.to_aで[[key1, value1],[key2, value2],…]となるようなものを取り出せる
- hash.delete("b")
- hash.delete("a"){|key| print key} はkeyがなかった時にブロックの中が呼ばれる
- selfはそのメソッドを実行しているオブジェクトを示す
- print(self.to_s); print(self.class.to_s)でmain, Objectと返す
- def addString(str) str << ",Japan" end; a = "Tokyo"; addString(a); print a
- 関数の引数はすべて参照渡し
- デフォルト引数は普通に使える
- def printHello(msg, *names) とすることで余った引数を配列としてすべてnamesに入れることができる
- returnを関数の中では使える。これは省略可能であり、最後に評価した式の返り値が関数の返り値となる
- return a,bのように多重で返すこともできる
- 理解した。a=1は1というオブジェクトに対して名前を張り替えてるだけ
- b = a; a = 2;としてもaが指すオブジェクトが変わるだけだからbに変化はない
- それに対してa = "a";b = a;a << "c";とするとも変わってしまう。これはaが指すオブジェクトに対して何らかの操作を加えているから
- class名は大文字からはじめなけれなならない
- class Car ~~ end; car1 = Car.new() で作成
- メソッドを呼び出すのはCar.method()でもCar::method()でも同じ
- インスタンス変数は@を先頭につけることで使うことができる。@hogeに値を入れた時点から使えるようになる。
- initializeメソッドを定義することによってクラスのオブジェクトを作成したときに必ずそれが呼ばれるようになる。
- インスタンス変数はクラスの外から値を取ってきたりできないのでアクセスメソッドをいちいち定義しなければならない
- それを省略することができるのがアクセスメソッド
attr_reader :変数名 参照が可能 attr_writer :変数名 更新が可能 attr_accessor :変数名 参照と更新が可能
- ちなみに、attr_accessorを書くというのは
class Hoge def name #reader return @name end def name=(val) #writer @name = val end end a = Hoge.new a.name = 'Hello, world!' puts a.name
- と書くことと一緒らしい
- classの中で生成した定数はclass::variableという形でアクセスできる
- @@を変数名の先頭につけることで暮らす変数を生成することができる
- これはメソッドの中ではないところで生成せよ。
- class A < Base で継承できる
- メソッドの中でsuperを呼ぶと、スーパークラスの同じ名前のメソッドを呼ぶことができる。つまりメソッドの中身の追加とかができる
- superは引数を入れても入れなくても良いが、入れなかった場合は今のメソッドに入ってきた引数をそのまま入れることになる
- public :メソッド名, private :メソッド名でpublic or privateにすることができる
- initializeメソッドは必ずprivateになる
- 単純にpublic, privateと書くだけならば、それ以降のメソッドがすべてpublic, privateになる
- initializeメソッドは普通のメソッドと同様に継承される
- module Hoge end でmoduleを宣言することができる。
- これはHoge.methodでメソッドにアクセスでき、インスタンス変数やらクラス変数はない
- classのなかではincludeでmoduleを読み込むことが可能
- moduleの関数を定義してもそれだけでは普通の関数としては使用できず、module_function :メソッド名というように中に書いてあげなければならない
- includeとして使う場合にはmodule_functionの宣言はいらないよ
- Float.induced_from(num) Integer.induced_fromを使って明示的にオブジェクトを作れるよ!
- to_i, to_fで変換できる(truncateはto_iと一緒)
- round, floor, ceilとかもあるよ
- to_sで文字列変換。引数で基数の指定ができる
- hoge.chrでasciiコードから文字列に変換できる
- "Hello"[1..2] = "pp"でHpploになる
- "Hello".insert(1, "oo")でHooelloになる
- "Hello".index("ll") => 2となる, rindexもある
- "Hello".include?("el") => true
- delete, chomo, chomp!(改行を削除)がある(!があると破壊的)
- strip(空白を取る)
- Array.flattenでネストした[[1,2],3]などを[1,2,3]にできる
- uniq, compact(nilを消す), delete, delete_at, delete_if, reverse, sort, transpose(行と列を入れ替える)
- rubyにoverloadはない
- これやろうな。