[an error occurred while processing this directive] [an error occurred while processing this directive]

Rubyのきほん

普通の変数

対話的に実行できるモードで起動するには、irbというコマンドを実行します。
$ irb
irb(main): 001:0>
ここで、好きなこと(print とか、代入とか)を書きます。 以下、irb(main): 001:0> は省略します。
> s = "Hello"
s に "Hello" という文字列を代入しました。
> print s
Hello
print を用いて、表示してみました。
> puts s
Hello
puts を使うと、文字のあとに改行が入ります。
> p s
"Hello"
p を使うと、オブジェクトらしく表示します。
デバッグ用のメッセージなどに重宝します。
> name = "kei"
> print "Hello, #{name}"
Hello, kei
print のあとには文字列があるのですが、ここで#{name}と書くと、nameという変数に入っている文字列を 呼び出すことができます。 今回はnameにkeiが入っているので、Hello, keiと表示されます。
> i = 3
> print i
3

> print i * 10
30
当然数値も変数に代入したり、計算したりできます。
まず i に 3を代入して print で表示、次にi * 10を計算して表示しています。

変数名を大文字からはじめると定数になります。
NAME = "kei"

リスト(配列)・ハッシュ/マップ(辞書)とループ

リストです。まずは普通に列挙。
names = ["kei", "lei", "mei"]
names.push("nei")
p namse
(出力) ["kei", "lei", "mei", "nei"]
リストのすべての要素について、ループさせてみます。
> names.each do |name|
    puts "name = #{name}"
> end
name = kei
name = lei
name = mei
name = nei
ちょっと癖があるんですが、nameにnamesの要素が一つずつ代入されます。 do とendは、{ と } でもOKです。書き直してみると、こんな感じになります。
> names.each { |name|
    puts "name = #{name}"
> }
name = kei
name = lei
name = mei
name = nei

他にも、3回ループという時にはこんな書き方もできます。
> 3.times do |i|
   puts i
> end
1
2
3
ループには、普通にwhileとかforも使えます。
"abc" が配列Aに入っているかを調べる。
A = ["abc", "def"]
if A.include?("abc") then
   puts '"abc" is in A'
end

リストのキー(配列の添字)は連続した整数しかだめですが、ハッシュ (マップ・辞書)を使うと、 文字列とか少数とかなんでも入れられます。
> h = {}
> h["name"] = "kei"
> h["age"] = 25
> h["country"] = "japan"
ループもできます。順番にキーと値が入ります。
A = {}
A[2] = 10
A["anc"] = "def"

A.each{|a,b}
  p a, b
}
キーごとにループとかもできます。
h.keys.each do |k|
  p k, h[k]
end
値でループのときはこっち
A.values.each do |a|
== DO SOMETHING == 
end
.eachを忘れそうになる (しかも忘れてもエラーにはならない)ので注意!

関数

irbで関数も作ってしまいましょう。
def say_hello_to(name)
  print "Hello, #{name}"
end
こうしたあとで、関数を呼び出せます。まずは普通に ()を使った呼び出し。
say_hello_to("kei")
(出力) Hello, kei=> nil
Rubyでは () を省略できます。ちょっとふしぎ。
say_hello_to "kei"
(出力) Hello, kei=> nil
関数なので、当然返り値を返せます。
def plus_2 (x)
  return x + 2
end

y = plus_2(10)
しかし実は Ruby ではReturnを書く必要が無くて、 最後の行で代入されたもの(最後の行を評価した値)が返ります。
def plus_2 (x)
  x + 2
end

y = plus_2(10)
もし最後の行が何も返さないと、返り値は全部nilが入ります。 Pythonみたく、関数の返り値は割りと柔軟です。
def version
  return "nexus", "6"
end

a, b = version
a には"nexus"が、bには6が入ります。

if と case

if 文はこんなかんじです。
if a==0 then
  print a
end
thenは書いてもかかなくてもいいですが、endは書かないといけないです。
C のswitchみたいなのとしては、case文があります。(ストイックなPythonと違ってなんでもありですね)
lunch = "pasta"
case a
when "pasta" 
  pasta_count = 1
end
when のあとに : とか { とか来ません。

正規表現

とっても自然に書けます。なかなかいいかんじ。
p = /(\d\d)-(\d\d)/
s = "12-34"
s =~p
print $1, $2
正規表現は文字列ではなく、 / /で囲みます。 そして、適当な変数と =~ でマッチさせます。
パターン内で()で囲んでいた部分は、順番に$1, $2に代入されます。

クラス

class a
  attr_accessor: abc
end

?とか!とかついたメソッド名があってはじめはぎょっとするけど、 ?とか!とかは普通の文字列として使われてるから、別に恐れる必要は無いです。ただ、気分的に ? が着くのは問い合わせのメソッドを、 ! が付くのは破壊的なメソッド (オブジェクトの中身が壊れる)を示すのが習慣らしいです。
[an error occurred while processing this directive]