lispとrubyとpythonと(ruby)
最後はruby。
Rubyも始めて書いた。噂で色々と聞いていたので結構違和感がない。
#コメント #標準出力に表示 puts "こんにちは" # print "こんにちは" # #改行は\n puts "こんにちは\n" #タブは\t puts "こんにちは\tこんにちは" #フォーマット #cのprintfと一緒 printf "こんにちは%s\n","世界" #文字列でフォーマット #cのsprintfと大体一緒 str = sprintf "こんにちは%s\n","世界" printf str #関数定義 def fun0 msg printf "「%s」を引数としてfunが呼ばれた\n", msg end fun0("あいうえお") #条件分岐 def fun1(n) if n < 10 printf "10未満\n" #elsifなんだそうだ elsif n == 10 printf "10\n" else printf "10以上\n" end end fun1(5) #こんな感じの方がRubyっぽい? #ぶら下がりif文書くよりも気持ちがいい。 def fun2 n printf "10未満\n" if n < 10 end fun2 5 def fun3 n printf "10以上\n" unless n < 10 end fun3 11 def fun4 n case n when 0 printf "0です\n" when 1..4 printf "5未満です" when 5 printf "5です" else printf "その他" end end fun4 6 #繰り返し def fun4 n for i in Range.new(0,n) printf "fun4 繰り返し%s回目\n", i end end fun4(3) ##最近は繰り返しの書き方が色々あってそれもどうなんだろう def fun5 n Range.new(0,n).each do |i| printf "fun5 繰り返し%s回目\n", i end end fun5(3) ##whileもある def fun6 n i = 0 while i < n printf "fun6 繰り返し%s回目\n", i i = i + 1 end end fun6 3 def fun7 n i = 0 begin printf "fun7 繰り返し%s回目\n", i i = i + 1 end while i < n end fun7 3 ##untilもある def fun8 n i = 0 until i > n printf "fun8 繰り返し%s回目\n", i i = i + 1 end end fun8 3 def fun9 n i = 0 begin printf "fun9 繰り返し%s回目\n", i i = i + 1 end until i > n end fun9 3 ##これら繰り返しサンプルは全部等価ってわけではない #定数定義 CONST_VALUE = "定数\n" ##全部大文字だと定数 ##再代入すると警告。警告だけなのか。。。 ##CONST_VALUE = "ss" printf CONST_VALUE #変数 ##小文字か_で始まるのはローカル変数 a = 0 ##変数のエクステントはスコープが切れるまで ##だけど、クロージャになってたらクロージャが消えるまで有効 2.times do p defined?(v) v = 1 p v end ##グローバル変数 ##$で始める $global_value #クラス定義 #インスタンス変数は@ class Cls0 #コンストラクタはinitialize def initialize val0,val1 @slot0 = val0 @slot1 = val1 end def disp printf "Cls0 %s:%s\n" , @slot0,@slot1 end end #継承 class Cls1 < Cls0 def initialize val0,val1,val2 #スーパークラスのinitializeを呼び出し super val0,val1 @slot2 = val2 end def disp printf "Cls1 %s:%s:%s\n" , @slot0,@slot1,@slot2 end end o0 = Cls0.new "初期値0","初期値1" o0.disp o1 = Cls1.new "初期値0","初期値1","初期値2" o1.disp o1.super_disp #ラムダ式 f0 = lambda do |s| printf s end f0.call "こんにちは\n" #クロージャ def makeDecorator prefix,suffix lambda do |s| prefix + s + suffix end end decorator = makeDecorator("<",">") printf (decorator.call "html") printf "\n" #rubyといえばモジュール #モジュール #rubyといえばブロックをとる関数 module Mod0 def withLog printf "処理開始\n" yield printf "処理終了\n" end end class Cls2 < Cls0 include Mod0 def disp withLog do printf "Cls2 %s:%s\n" , @slot0,@slot1 end end end o2 = Cls2.new "あ","い" o2.disp