情報学部 | 菅沼ホーム | 目次 | 索引 |
c:\tmp>irb irb(main):001:0> a = 10 => 10 irb(main):002:0> 10 => 10 irb(main):003:0> p a+10 20 => 20 irb(main):004:0> quit c:\tmp>
ruby [ option ] [ programfile ] [ argument ]
# 例えば,ruby test.rb
option : インタプリータに対するオプション programfile : プログラムファイル argument : プログラムに対する引数
"abc" + "efg\n" "abc" "efg\n"
#! ruby -Ks y = ` ls -l ` printf "%s\n", y printf "終了ステータス %d\n", $?
total 1 -rwxr-xr-x 1 1005 everyone 44 Jun 8 13:45 test.rb 終了ステータス 0
a = 10 a = "abc"
conts int x = 10; // 変数 x の値を,以後,修正できない
演算子 | 使用目的 |
---|---|
:: | クラス内部の定数などの参照 例: Test::Const |
[] | 配列要素などの参照 例: x[2] |
+(単項) | 数値の符号 |
! | 論理否定 |
~ | ビット演算子(否定) |
**(*) | べき乗 例: 2**0.5 |
-(単項) | 数値の符号 |
* | 乗算など |
/ | 除算,整数どうしの場合は小数点以下切り捨て |
% | 余り演算など,浮動小数点どうしの演算も可能 |
+ | 加算,文字列の連結など |
- | 減算など |
<< | ビット演算子(左シフト)など |
>> | ビット演算子(右シフト)など |
& | ビット演算子(論理積)など |
| | ビット演算子(論理和)など |
^ | ビット演算子(排他的論理和)など |
> | 比較演算子 例: a > b( a は b より大) |
>= | 比較演算子 例: a >= b( a は b 以上) |
< | 比較演算子 例: a < b( a は b より小) |
<= | 比較演算子 例: a <= b( a は b 以下) |
<=>(*) | 比較を行い,正,0,負の判定など |
== | 比較演算子 例: a == b( a と b は等しい?) |
===(*) | クラス又はそのサブクラスのインスタンスであるか否かの比較など |
!= | 比較演算子 例: a != b( a と b は等しくない?) |
=~(*) | 正規表現とのマッチ |
!~(*) | 正規表現にマッチする場合に false,マッチしない場合に true |
&& | 論理積 |
|| | 論理和 |
..(*) | 範囲式 |
...(*) | 範囲式 |
?: | 条件演算子 |
= | 代入演算子 |
not | 論理否定( ! ) |
and | 論理積( && ) |
or | 論理和( || ) |
x = x + 5
x += 5
+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||
01 ############################ 02 # 2つのデータの乗算と除算 # 03 # coded by Y.Suganuma # 04 ############################ 05 # データの入力 06 printf "2つのデータを入力して下さい "; 07 #print "2つのデータを入力して下さい "; 08 str = gets().strip(); # gets でも良い(以下の関数も同様); 09 a = str.split(" "); 10 x = Integer(a[0]); 11 y = Integer(a[1]); 12 # 和と差の計算 13 mul = x * y; 14 div = x / y; 15 # 結果の出力 16 printf "乗算=%d 除算=%d\n", mul, div; 17 #print "乗算=", mul, " 除算=", div, "\n";
=begin 2つのデータの乗算と除算 coded by Y.Suganuma =end
printf("結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data)
d_data = -12.34456 i_data = -12 c_data = "abc"; printf "結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data
2つのデータを入力して下さい 8 3
乗算=24 除算=2
式1 ? 式2 : 式3
a = (b > 0) ? 1 : 2
if 式1 [then] 式2 [elsif 式3 [then] 式4 ] ・・・ [else 式5 ] end
while 式1 [do] 式2 end
for ループ変数 in 式1 [do] 式2 end
break
for i in Array[1, 5, -1, 6, 7] if i < 0 break end printf "%d ", i end printf "\n"
next
for i in Array[1, 5, -1, 6, 7] if i < 0 next end printf "%d ", i end printf "\n"
redo
sw = 0 for i in Array[1, 5, -1, 6, 7] if i < 0 && sw == 0 sw = 1 redo end printf "%d ", i end printf "\n"
x1 = Array[1, 2.3, "abc"]; # x1 = [1, 2.3, "abc"]; でも可 p x1 x2 = Array.new(3) x2[0] = 1 x2[1] = 2.3 x2[2] = "abc" p x2 x3 = Array.new() x3.push(1) x3.push(2.3) x3.push("abc") p x3
v1 = Array[[10, 20, 30], [40, 50, 60]] p v1 v2 = Array.new(2) v2[0] = Array[10, 20, 30] v2[1] = Array[40, 50, 60] p v2 v3 = Array.new() v3.push([10, 20, 30]) v3.push([40, 50, 60]) p v3
a = 10; b = a; b = 20;
u1 = Array[1, "abc", 2] u2 = Array[1, "abc", 2] u3 = u1 u3[1] = 4 print u1[1]," ",u2[1]," ",u3[1] # 4 abc 4
u1 = Array[1, 2, 3]; u2 = Array[1, 2, 3]; u3 = u1; print "u1 : ", u1[0], " ", u1[1], " ", u1[2], "\n" print "u2 : ", u2[0], " ", u2[1], " ", u2[2], "\n" print "u3 : ", u3[0], " ", u3[1], " ", u3[2], "\n" print " u1[0] -> 10,u2[1] -> 20,u3[2] -> 30\n" u1[0] = 10 u2[1] = 20 u3[2] = 30 print "u1 : ", u1[0], " ", u1[1], " ", u1[2], "\n" print "u2 : ", u2[0], " ", u2[1], " ", u2[2], "\n" print "u3 : ", u3[0], " ", u3[1], " ", u3[2], "\n"
u1 : 1 2 3 u2 : 1 2 3 u3 : 1 2 3 u1[0] -> 10,u2[1] -> 20,u3[2] -> 30 u1 : 10 2 30 u2 : 1 20 3 u3 : 10 2 30
v1 = Array[[10, 20, 30], [40, 50, 60]] v2 = Array[[10, 20, 30], [40, 50, 60]] v3 = v1
v4 = v1[0]; // v1,v3 の 1 行目
01 u1 = Array[10, 20, 30] 02 u2 = Array.new(u1) 03 u3 = u1 04 u4 = u1.clone 05 u3[0] = 100 06 u4[1] = 200 07 print "u1 ", u1, "\n" 08 print "u2 ", u2, "\n" 09 print "u3 ", u3, "\n" 10 print "u4 ", u4, "\n" 11 12 v1 = Array[[10, 20, 30], [40, 50, 60]] 13 v2 = Array.new(v1) 14 v3 = v1 15 v4 = v1.clone 16 v3[1][1] = 100 17 v4[0][1] = 200 18 print "v1 ", v1, "\n" 19 print "v2 ", v2, "\n" 20 print "v3 ", v3, "\n" 21 print "v4 ", v4, "\n"
u1 [100, 20, 30] u2 [10, 20, 30] u3 [100, 20, 30] u4 [10, 200, 30] v1 [[10, 200, 30], [40, 100, 60]] v2 [[10, 200, 30], [40, 100, 60]] v3 [[10, 200, 30], [40, 100, 60]] v4 [[10, 200, 30], [40, 100, 60]]
def メソッド名 [ 引数の並び ] 式 ・・・ [rescue [error_type,..] [=> evar] [then] 式..].. [else 式..] [ensure 式..] end
def func (par1, par2=10, par3=30) x = par1 + par2 + par3 return x end print func(100, 50)
Proc.new do | パラメータ| 式 end Proc.new { | パラメータ| 式 } proc do | パラメータ| 式 end proc { | パラメータ| 式 } lambda do | パラメータ| 式 end lambda { | パラメータ| 式 }
01 # add1 = lambda { |x, y| return x + y } 02 # add1 = lambda do |x, y| return x + y end 03 add1 = lambda { |x, y| 04 return x + y 05 } 06 print "lambda : ", add1.call(1, 2), "\n" 07 08 def add2(x, y) 09 f = lambda { return x + y } 10 return f.call 11 end 12 print "lambda(関数) : ", add2(1, 2), "\n" 13 14 add3 = Proc.new { |x, y| 15 x + y # return x + y は No 16 } 17 print "Proc.new : ", add3.call(1, 2), "\n" 18 19 def add4(x, y) 20 f = Proc.new { return x + y } # f = proc { return x + y } 21 return f.call 22 end 23 print "Proc.new(関数) : ", add4(1, 2), "\n"
lambda : 3 lambda(関数) : 3 Proc.new : 3 Proc.new(関数) : 3
method(arg1, arg2, ...) do [ | パラメータ | ] 式 ... end
method(arg1, arg2, ...) { [ | パラメータ | ] 式 ... }
method(arg1, arg2, ..., &proc_object) # proc_object は別に定義
01 #************************/ 02 # 様々な引数 */ 03 # coded by Y.Suganuma */ 04 #************************/ 05 a = 10 06 # 07 # ブロック付きメソッド 08 # 09 print "ブロック付きメソッド\n" 10 def add5(x, y = 20, &blk) 11 x = 5 12 r = blk.call(x, y) # yield(x, y) 13 return r 14 end 15 16 res = add5(a) { |x, y| x + y } # return x + y は No 17 print " ブロック付きメソッド(直接) : a = ", a, ", sum = ", res, "\n" 18 19 add_l = lambda { |x, y| 20 return x + y 21 } 22 res = add5(a, &add_l) 23 print " ブロック付きメソッド(lambda) : a = ", a, ", sum = ", res, "\n" 24 25 add_p = Proc.new { |x, y| 26 x + y # return x + y は No 27 } 28 res = add5(a, &add_p) 29 print " ブロック付きメソッド(Proc.new) : a = ", a, ", sum = ", res, "\n" 30 # 31 # 最小値,最大値を求めるブロック付きメソッド 32 # 33 print "最小値,または,最大値を求めるメソッド\n" 34 def min_max(x, &blk) 35 x[3] = -3 36 re = x[0] 37 for a in x[1...x.length] 38 re = yield(re, a) ? re : a 39 # re = blk.call(re, a) ? re : a 40 end 41 return re 42 end 43 # ブロック max の定義と利用 44 max = lambda { |x, y| 45 return x > y 46 } 47 print " 2 > 1 ? ", max.call(2, 1), "\n" 48 # ブロック min の定義と利用 49 min = lambda { |x, y| 50 return x < y 51 } 52 print " 1 < 2 ? ", min.call(1, 2), "\n" 53 # 最大値,最小値の計算 54 x = [1, 4, 2, 3, 5] 55 print " max ", min_max(x, &max), " x ", x, "\n" 56 print " min ", min_max(x, &min), " x ", x, "\n"
ブロック付きメソッド ブロック付きメソッド(直接) : a = 10, sum = 25 ブロック付きメソッド(lambda) : a = 10, sum = 25 ブロック付きメソッド(Proc.new) : a = 10, sum = 25 最小値,または,最大値を求めるメソッド 2 > 1 ? true 1 < 2 ? true max 5 x [1, 4, 2, -3, 5] min -3 x [1, 4, 2, -3, 5]
class 識別子 [ < superclass ] 式(演算式,メソッド,クラスなど) ・・・ end
obj1 = Test.new obj2 = Test.new(10, 20) # 引数がある場合
01 #************************/ 02 # クラスの定義と参照 */ 03 # coded by Y.Suganuma */ 04 #************************/ 05 v_local_1 = 5 06 $_global_1 = 15 07 V_const_1 = 25 08 @_instance_1 = 35 09 @@_class_1 = 45 # 警告メッセージ出力 10 11 class Test 12 v_local_2 = 10 13 $_global_2 = 20 14 V_const_2 = 30 15 @_instance_2 = 40 16 @@_class_2 = 50 17 18 print "クラス内からクラス外の変数を参照\n" 19 # print " v_local_1 : ", v_local_1, "\n" # 参照不可(エラー) 20 print " $_global_1 : ", $_global_1, "\n" 21 print " V_const_1 : ", V_const_1, "\n" 22 print " @_instance_1 : ", @_instance_1, "\n" # 参照不可 23 print " @@_class_1 : ", @@_class_1, "\n" 24 25 print "クラス内からクラス内の変数を参照\n" 26 print " v_local_2 : ", v_local_2, "\n" 27 print " $_global_2 : ", $_global_2, "\n" 28 print " V_const_2 : ", V_const_2, "\n" 29 print " @_instance_2 : ", @_instance_2, "\n" 30 print " @@_class_2 : ", @@_class_2, "\n" 31 # コンストラクタ 32 def initialize(par = 100) 33 @_instance_2 = par 34 end 35 # インスタンス変数の出力 36 def out 37 print " @_instance_2 : ", @_instance_2, "\n" 38 end 39 # インスタンス変数を外部から参照可能にする 40 attr("_instance_2", true) 41 end 42 43 print "クラス外からクラス外の変数を参照\n" 44 print " v_local_1 : ", v_local_1, "\n" 45 print " $_global_1 : ", $_global_1, "\n" 46 print " V_const_1 : ", V_const_1, "\n" 47 print " @_instance_1 : ", @_instance_1, "\n" 48 print " @@_class_1 : ", @@_class_1, "\n" # 警告メッセージ出力 49 50 print "クラス外からクラス内の変数を参照\n" 51 #print " v_local_2 : ", Test::v_local_2, "\n" # 参照不可(エラー) 52 print " $_global_2 : ", $_global_2, "\n" # Test:: を付加するとエラー 53 print " V_const_2 : ", Test::V_const_2, "\n" 54 print " @_instance_2 : ", @_instance_2, "\n" # 参照不可 55 #print " @@_class_2 : ", @@_class_2, "\n" # 参照不可(エラー) 56 # インスタンスの生成 57 obj1 = Test.new 58 obj2 = Test.new(200) 59 60 print "インスタンスからクラス内の変数を参照\n" 61 #print " v_local_2 : ", obj1.v_local_2, "\n" # 参照不可(エラー) 62 #print " $_global_2 : ", obj1.$_global_2, "\n" # 参照不可(エラー) 63 #print " V_const_2 : ", obj1.V_const_2, "\n" # 参照不可(エラー) 64 obj1.out() 65 obj2.out() 66 #print " @_instance_2 : ", obj1.@_instance_2, "\n" # 参照不可(エラー) 67 print " @_instance_2 : ", obj1._instance_2, "\n" # attr による設定が必要 68 print " @_instance_2 : ", obj2._instance_2, "\n" 69 #print " @@_class_2 : ", obj1.@@_class_2, "\n" # 参照不可(エラー)
test.rb:9: warning: class variable access from toplevel クラス内からクラス外の変数を参照 $_global_1 : 15 V_const_1 : 25 @_instance_1 : @@_class_1 : 45 クラス内からクラス内の変数を参照 v_local_2 : 10 $_global_2 : 20 V_const_2 : 30 @_instance_2 : 40 @@_class_2 : 50 クラス外からクラス外の変数を参照 v_local_1 : 5 $_global_1 : 15 V_const_1 : 25 @_instance_1 : 35 test.rb:48: warning: class variable access from toplevel @@_class_1 : 45 クラス外からクラス内の変数を参照 $_global_2 : 20 V_const_2 : 30 @_instance_2 : オブジェクトからクラス内の変数を参照 @_instance_2 : 100 @_instance_2 : 200 @_instance_2 : 100 @_instance_2 : 200
class P_Test @@_class = 10 print "クラス変数 @@_class = ", @@_class, " (in P_Test)\n" def func print "こんにちは!!" end end class Test < P_Test print "クラス変数 @@_class = ", @@_class, " (in Test)\n", class Test_in # print "クラス変数 @@_class = ", @@_class, " (in Test)\n" 参照不可 end end #print "クラス変数 @@_class = ", @@_class, "\n" 参照不可 t_obj1 = P_Test.new t_obj1.func print " (in P_Test)\n" t_obj2 = P_Test.new t_obj2.func print " (in Test)\n"
クラス変数 @@_class = 10 (in P_Test) クラス変数 @@_class = 10 (in Test) こんにちは!! (in P_Test) こんにちは!! (in Test)
class P_Test def add(p1, p2=20, p3=30) return p1 + p2 + p3 end end class Test < P_Test def add(p) return p + super end end print Test.new.add(100)
module Add_m Const = 100 def add(a, b) return a + b end end class Test include Add_m def sub(a, b) return a - b + Const end end printf "%d\n", Test.new.add(10, 20) printf "%d\n", Test.new.sub(10, 20)
module Add_m Const = 100 def add(a, b) return a + b end end class Test def sub(a, b) return a - b end end obj = Test.new obj.extend Add_m printf "%d\n", obj.add(10, 20) printf "%d\n", obj.sub(10, 20)
01 print "データを 2 つ入力してください " 02 x = (gets().strip()).split() 03 print "*** 配列 x を print で出力 ***\n" 04 print "print ", x, "\n" 05 print "*** 配列 x を p で出力 ***\n" 06 p "p ", x 07 print "*** 配列 x を puts で出力 ***\n" 08 puts "puts ", x 09 print "*** 配列 x を printf で出力 ***\n" 10 printf "x[0] %d x[1] %d\n", x[0], x[1] 11 print "*** x[0] と x[1] の加算結果を print で出力 ***\n" 12 print "x[0] + x[1] = ", x[0].to_i() + x[1].to_i(), "\n"
データを 2 つ入力してください 1 2 *** 配列 x を print で出力 *** print ["1", "2"] *** 配列 x を p で出力 *** "p " ["1", "2"] *** 配列 x を puts で出力 *** puts 1 2 *** 配列 x を printf で出力 *** x[0] 1 x[1] 2 *** x[0] と x[1] の加算結果を print で出力 *** x[0] + x[1] = 3
1 2 3 4 ・・・・・
01 inp = File.open("data1.txt", "r") # data1.txt から入力 02 out = File.open("data2.txt", "w") # data2.txt へ出力 03 while line = inp.gets # データが無くなるまで繰り返す 04 x = line.split() 05 out.print x[0].to_i() + x[1].to_i(), "\n" 06 end 07 inp.close # ファイルを閉じる 08 out.close # ファイルを閉じる 09 10 =begin 11 $stdin = open("data1.txt", "r") 12 $stdout = open("data2.txt", "w") 13 while line = gets 14 x = line.split() 15 print x[0].to_i() + x[1].to_i(), "\n" 16 end 17 $stdin = STDIN # 通常の標準入力に戻す 18 $stdout = STDOUT # 通常の標準出力に戻す 19 =end
01 #***************************/ 02 # 変数の有効範囲(スコープ) */ 03 # coded by Y.Suganuma */ 04 #***************************/ 05 06 #******************/ 07 # クラス Example1 */ 08 #******************/ 09 class Example1 10 Const = 1000; 11 @@_class = 2000; 12 13 def initialize 14 @_pro = 3000; 15 end 16 17 def sub1() 18 printf("sub1 Const %d @@_class %d @_pro %d\n", Const, @@_class, @_pro); 19 end 20 end 21 22 #******************/ 23 # クラス Example2 */ 24 #******************/ 25 class Example2 < Example1 26 public 27 def sub2() 28 printf("sub2 Const %d @@_class %d @_pro %d\n", Const, @@_class, @_pro); 29 end 30 31 attr_accessor("_pro"); 32 end 33 34 #***********/ 35 # 関数 sub */ 36 #***********/ 37 def sub() # この位置で定義する必要がある 38 x = 40; 39 printf(" sub x %d\n", x); 40 printf(" sub z %d\n", $z); 41 end 42 43 #***************/ 44 # main program */ 45 #***************/ 46 # ブロック 47 x = 10; 48 $z = 30; 49 if x > 5 50 printf("block x %d\n", x); 51 x = 15; 52 y = 20; 53 printf("block x %d\n", x); 54 printf("block y %d\n", y); 55 else 56 printf("block x %d\n", x); 57 x = -15; 58 printf("block x %d\n", x); 59 end 60 sub(); 61 printf("x %d\n", x); 62 printf("y %d\n", y); # 最初の x が 1 の時は,y が未定義のためエラー 63 # クラス 64 ex = Example2.new; 65 ex.sub1(); 66 ex.sub2(); 67 printf("public member( Const ) %d\n", Example2::Const); 68 printf("public member( @_pro ) %d\n", ex._pro);
block x 10 block x 15 block y 20 sub x 40 sub z 30 x 15 y 20
sub1 Const 1000 @@_class 2000 @_pro 3000 sub2 Const 1000 @@_class 2000 @_pro 3000 public member( Const ) 1000 public member( @_pro ) 3000
情報学部 | 菅沼ホーム | 目次 | 索引 |