概要
GR-CITRUSはRuby言語で動作することができます。ここではRuby初心者のために(筆者も初心者ですが)、簡単なプログラムを動かしながら基本文法を学習します。
Ruby言語についての詳細については以下に示すようなサイトをご参照ください。筆者はC言語を主としてプログラミングを行ってきましたので、気になるCとRubyの違いや、Rubyのよいところなどを中心に記載していきたいと思います。
準備
ハードウェア
GR-CITRUS、USBケーブル(マイクロBタイプ)の2つを準備します。
ソフトウェア
Rubicを使用します。Rubicの使用方法は「Rubicではじめよう!(Ruby編)」を参照してください。
表示
まずはHello Worldですね!
プログラムの流れを確認するため、PCにメッセージを送るときにSerialクラスのprintを使います。Rubyでよく使用されるputsやp("object")は文法エラーになりますので注意してください。ちなみにnewでSerialクラスのインスタンスを生成していますが、引数の0はUSBを使うことを意味しています。
usb = Serial.new(0)
usb.print("Hello")
(結果)
Hello
printIn
改行を入れるときはprintlnとします。
usb = Serial.new(0)
usb.println("Hello")
usb.print("Hello")
(結果)
Hello
Hello
変数
プログラムではまず演算しますよね!演算に必要なのは変数です。RubyにはC言語のように型宣言はありません。ただ、数値か文字かは意識した方がいいです。
数値の扱い
C言語のように型宣言は不要です。ただ、変数をprintで表示するとき、引数は文字列のため、to_sメソッドで数値から文字列変換する必要があります。
usb = Serial.new(0)
a=7
usb.println(a.to_s) # integer to string
a+=1
usb.println(a.to_s)
(結果)
7
8
文字列の扱い
変数に文字列を入れるときはダブルクオーテーションで囲めばOKです。
usb = Serial.new(0)
a="123"
usb.println(a)
a+="abc"
usb.println(a)
(結果)
123
123abc
ダブルクオーテーションも含める場合はシングルクオーテーションで囲めばOKです。
usb = Serial.new(0)
a = '"a"'
usb.println(a.to_s)
(結果)
"a"
文字列の数値変換
文字列を数値に変換する場合、整数のときはto_iメソッド、浮動小数点のときはto_fで変換します。
usb = Serial.new(0)
a ="123.001"
usb.println(a)
b = a.to_i + 456.12
usb.println(b.to_s)
b = a.to_f + 456.12
usb.println(b.to_s)
(結果)
123.001
579.12
579.121
文字列の操作
Rubyの文字列操作は強力です。サンプルではその一部を紹介しています。
usb = Serial.new(0)
a ="aabbccddeeaabbccddee"
usb.println(a)
usb.println(a.length.to_s) #length
usb.println(a.include?("ee").to_s) #include
usb.println(a.upcase) #upcase
usb.println(a.downcase) #downcase
usb.println(a.gsub("a","A")) #gsub (replace)
(結果)
aabbccddeeaabbccddee
20
true
AABBCCDDEEAABBCCDDEE
aabbccddeeaabbccddee
AAbbccddeeAAbbccddee
配列
配列の作成
型宣言不要で配列を作成できます。インデックスはC言語と同様に0からです。
usb = Serial.new(0)
a = [1,2,3,4]
usb.println(a[2].to_s)
(結果)
3
要素
数値、文字列の両方を要素にできます。混在もできます。
usb = Serial.new(0)
a = [1, "def", 3.14]
usb.println(a[1].to_s)
(結果)
def
要素の追加や結合
Rubyの配列操作は楽々です。追加や結合の例です。unshift, push, concatを使っています。
usb = Serial.new(0)
a = ["pen"]
a.unshift("apple")
a.each do |n|
usb.print(n)
usb.print(" ")
end
usb.println()
b = ["pen"]
b.push("pineapple")
b.each do |n|
usb.print(n)
usb.print(" ")
end
usb.println()
b.concat(a)
b.each do |n|
usb.print(n)
usb.print(" ")
end
(結果)
apple pen
pen pineapple
pen pineapple apple pen
each
eachメソッドは配列を順に取り出します。
usb = Serial.new(0)
a = [1, 2.3, "abc", [1,2]]
a.each do |n|
usb.println(n.to_s)
end
(結果)
1
2.3
abc
[1,2]
ループ
C言語でのforやwhileです。Rubyでも使えますよ。
while
定番のwhileです。条件文が真の場合に繰り返します。
usb = Serial.new(0)
a = 5
while a > 0 do
usb.println(a.to_s)
a = a - 1
end
(結果)
5
4
3
2
1
times
指定回数実行します。変数aを使わない場合は|a|がなくてもOKです。
usb = Serial.new(0)
5.times do |a|
usb.println(a.to_s)
end
(結果)
0
1
2
3
4
for
範囲オブジェクト(1..3の部分)の分実行します。正確には後述するeachメソッドで取得できる回数分実行されます。
usb = Serial.new(0)
for a in 1..3 do
usb.println(a.to_s)
end
(結果)
0
1
2
3