読者です 読者をやめる 読者になる 読者になる

Make Local Happiness

自分の幸せは自分で作る!!!

2013年が終わるまでにRubyやってみる (その2:ドットインストールRuby入門学習)

ruby ドットインストール

ドットインストールってすごいですよね。

たった3分以内の動画を多くても30回ほどやっただけで、

その言語に対する抵抗感をなくしてくれる。

 

すぐに他の事も試したいって思わせてくれる。

 

百式さんありがとうございます。

今回はRuby入門(全32回)をやってみました。

つらつらと備忘録としてメモしておきます。 

 

rubyの概要

日本人のまつもとひろゆきさんが作った言語

洗練されたオブジェクト指向型のスクリプト言語

 

Hellow World 

 

 

print "Hello World" #改行なしで表
puts "Hello World again" #改行付きで表示 p "Hello World" #オブジェクトがわかる形で表示

と出力コマンドの違いについても教わりました。

こんな感じで出力されます。

Hello WorldHello World again      

"Hello World

最後の「p」だけはダブルクォーテーションで囲まれていることから文字列ということがわかります。

 

変数と定数について

変数とは:オブジェクトにつける名前    

x = 10                             

p x  

                                   

#変数名のルール                    

 - 英子文字か_で始まる               

 - 予約語はなし 例えばendとか       

 

定数とは:全部大文字、途中で変更をしちゃだめ 

MY_EMAIL = "dotinstall@gmail.com"                      

 

オブジェクト指向に使われる用語について

# オブジェクト:便利な命令が詰まったデータ型

# メソッド:便利な命令

x = "hellow".length  

p x

出力

"length:6"

「x」がString型のオブジェクトで

「.length」がStringオブジェクトのメソッド

 

# クラス:設計図

# インスタンス:実体化されたデータ 

 # String クラスから派生したインスタンスが"hello"                      

 

数値的なオブジェクト

r = Rational(2,3)                  

p r                                

y = Rational(2,3) + Rational(5,6)  

p y  

 

###出力

(2/3)

(3/2)

 

数値的なオブジェクトで使えるメソッド

 #整数に        

 p 10.5.to_i

 

#分数へ変換    

 p 10.5.to_r       

#四捨五入      

 p 10.8.round   

 #ランダム      

 p rand(100)    

#平方根        

 p Math.sqrt(2) 

 

###出力

10                

(21/2)            

11                

37                

1.4142135623730951

 

文字列オブジェクト

シングルクォーテーションかダブルクォーテーションかで、

特殊文字の表示が異なる

# 特殊文字 \n \t 

 

puts "hellow\nworld"               

puts 'hellow\nworld'

 

#変数を出力したい場合 #{変数名}

name = "taguchi"                   

puts "my name is #{name}"  

 

#日本語対応                        

#一番先頭に #encoding: utf-8をつける                                 

puts "こんにちわ"

 

###出力

hellow            

world             

hellow\nworld     

my name is taguchi

こんにちわ        

                

文字列オブジェクトのメソッド                        

p "hellow".upcase       

p "hellow".reverse      

p "hellow".index("o")   

p "hellow".include?("o")

 

###出力

"HELLOW"

"wolleh"

4       

true    

"HELLOW"

 

破壊的メソッド

#ビックリマークをつけると元の変数の値を更新する

s = "hellow"  

s1 = s.upcase!

p s           

p s1          

 

###出力

"HELLOW" 

"HELLOW" 

 

配列オブジェクト

names = ["taguchi","ito","issei"]

p names                          

p names[0]                              

#1から2番目まで                 

p names[1..2]                    

#2番目を含まない                 

p names[0...2]                   

#後ろから                        

p names[-1]

 

###出力

["taguchi", "ito", "issei"]

"taguchi"                  

["ito", "issei"]           

["taguchi", "ito"]         

"issei"                    

                      

配列オブジェクトの操作

names = ["taguchi","ito","issei"]  

names[0] = "taguchi_new"     

p names[0]   

names[1..2] = ["ito_new","issei_new"]

p names[1..2]                      

names[0,2] = ["taguchi_new2","issei_new2"]                            

p names[0,2]                       

#要素を追加する                    

names[1,0] = ["c","d"]             

p names

 

###出力

"taguchi_new"                      

["ito_new", "issei_new"]           

["taguchi_new2", "issei_new2"]     

["taguchi_new2", "c", "d", "issei_new2", "issei_new"]                                   

      

配列オブジェクトの演算            

配列操作の簡易さがヤバい

これはphpばかり触っている場合じゃないと感じた

 

a = [1,2,3,4]   

b = [3,4,5,6]

# & | - +       

#共通部分を出力 

p a&b   

#重複なしで表示

p a|b  

#重複を削除  

p a-b

#すべてを足す   

p a+b 

 

###出力

[3, 4]                  

[1, 2, 3, 4, 5, 6]      

[1, 2]                  

[1, 2, 3, 4, 3, 4, 5, 6]

 

配列オブジェクトのメソッド 

a = [1,5,3,4,5,4,8]  

#重複をなくす         

p a.uniq              

 #ソート               

p a.sort              

#先頭と末尾           

# unshift / push (先頭追加/末尾追加) 

# shift / pop (先頭削除/末尾削除)

p a.unshift(0)        

p a.push(9)           

p                     

p a.shift(1)          

p a                   

p a.pop(1)            

p a                   

 

###出力

[1, 5, 3, 4, 8]              

[1, 3, 4, 4, 5, 5, 8]        

[0, 1, 5, 3, 4, 5, 4, 8]     

[0, 1, 5, 3, 4, 5, 4, 8, 9]  

[0]                          

[1, 5, 3, 4, 5, 4, 8, 9]     

[9]                          

[1, 5, 3, 4, 5, 4, 8]        

 

ハッシュオブジェクト(連想配列)について

sales = {"tanaka"=>100,"ito"=>150,issei"=>300}                       

p sales                            

p sales["ito"]

 

###出力

{"tanaka"=>100, "ito"=>150, "issei"=>300}      

150                           

   

ハッシュオブジェクトのメソッド

sales = {"tanaka"=>100,"ito"=>150,issei"=>300}                       

p sales.size                 

p sales.empty?               

p sales.has_key?("nakamura") 

p sales.has_value?(150)      

 

###出力

3     

false 

false 

true  

 

日付や時間に関するメソッド  

t = Time.now                     

p t                              

p t.month                        

t = Time.mktime(2011,2,24,9,0,0)                                  

p t                              

p t + 10                         

p t.strftime("%Y/%m/%d")         

 

###出力

2013-12-23 13:24:40 +0900

12                       

2011-02-24 09:00:00 +0900

2011-02-24 09:00:10 +0900

"2011/02/24"             

 

printfについてフォーマット化された文字列

x = "taguchi"                      

y = 25                             

                                   

printf("%s score is %d\n",x,y)     

#常にxは10桁、yは8桁で表示する場合 

printf("%-10s score is %08d\n",x,y)

                                   

#出力する文字列を返す              

s = sprintf("%-10s score is %08d\n"

,x,y)                              

p s   

 

###出力                  

taguchi score is 25             

taguchi    score is 00000025    

"taguchi    score is 00000025\n"           

                             

条件分岐(if文)

score = 62              

if score >= 80 then     

    puts "great!"       

elsif score >= 60       

    puts "so so.."      

else                    

    puts "not so great!"

end   

 

###出力

  so so..  

 

if文の別の書き方

puts "great!" if score > 80                            

#条件演算子 if ... else ..  

#(条件) ? 値1 : 値2        

a = 50                      

b = 20                      

max = (a > b) ? a : b       

p max    

                  

###出力

 50 

比較演算子

#記号のことを比較演算子            

# < > >= <=                        

# == !=                            

# 文字列のマッチング               

#  =~   

puts "match!" if /taguchi/ =~ "my name is taguchi"                    

 

# && ||                                                               

x = 9                              

if x >= 1 && x <= 10 then          

        puts "great!"              

end     

 

###出力

match!

great!

 

case文による条件分岐

 signal = "yellow"                                            

case signal                    

when "red"                     

        puts "stop!"           

when "green","blue"            

        puts "go!"             

when "yellow"                  

        puts "caution!"        

else                           

        puts "signal is broken"

end   

 

###出力

caution!

 

timesメソッドによる繰り返し処理                          

10.times do |i| 

 puts "#{i} hi!"

end             

 

###出力

 0 hi!  

 1 hi!  

 2 hi!  

 3 hi!  

 4 hi!  

 5 hi!  

 6 hi!  

 7 hi!  

 8 hi!  

 9 hi!  

 

for/eachによる繰り返し処理

users = ["taguchi","fkoji","dotinstall"]                              

for user in users do               

        puts user                  

end                                

 users.each do |user|               

       puts user                   

end                                

 for i in 1..10 do                  

        puts i                     

end

                               

### 出力 

taguchi    

fkoji      

dotinstall 

taguchi    

fkoji      

dotinstall 

1          

2          

3          

4          

5          

6          

7          

8          

9          

10         

 

ハッシュオブジェクトと繰り返し処理                            

scores = {"taguchi" => 200, "fkoji"

=> 300, "dotinstall"=>120}         

                                   

scores.each do |key,value|         

  printf("%s,s score is %d\n",key,v

alue)                              

end                                

 

###出力

taguchi,s score is 200   

fkoji,s score is 300     

dotinstall,s score is 120       

 

while文による繰り返し処理 

i = 1           

while i < 10 do 

        puts i  

        #i = i+1

        i += 1  

end             

 

### 出力     

1

2

3

4

5

6

7

8      

9

メソッドの定義

#お約束                         

#メソッドの定義はdef            

#メソッド名の先頭は数字を使えない

def sing              

        puts "lalala~"

end                   

sing()                

 

def sing2(word)                  

        puts word+word+word + "~"

end                              

sing2("fu")                      

                                 

def sing3(word = "la")           

        puts word+word+word+"~"  

end                              

sing3()                          

sing3("hu")                      

 

###出力

lalala~

fufufu~              

lalala~              

huhuhu~              

 

メソッドの引数、返り値について

def sing4(word="la" , num )  

  s = ""                     

  for i in 1..num do         

        s += word            

  end                        

  s += "~"                   

  return s                   

end                          

                             

res = sing4("hu",10)         

puts res                     

 

###出力

huhuhuhuhuhuhuhuhuhu~ 

 

クラスの定義+クラスからインスタンスの作成

#大文字で始まる                 

#@変数名でインスタンス変数となる

class Monster                      

  #initializeはインスタンス生成時に必ず呼ばれるメソッド                           

  def initialize(name)             

    @name = name                   

    @hp = 100 + rand(100)          

    printf("%s appered. His hp is %d\n",@name,@hp)                    

  end                              

                                   

  def damage                       

    @hp -= 10 + rand(10)           

    printf("%s's hp is now %d\n",@name,@hp)                           

    printf("%s is now dead!\n",@name) if @hp < 0                      

  end                              

                                   

  def heal                         

    @hp += 10 + rand(10)           

    printf("%s's hp is now %d\n",@name,@hp)                           

  end 

end   

 

#呼び出し部分

slime = Monster.new("slime") 

slime.damage                 

slime.damage                 

mummy = Monster.new("mommy") 

10.times do |i|              

  mummy.damage               

end                          

 

###出力

slime appered. His hp is 132

slime's hp is now 117       

slime's hp is now 102       

mommy appered. His hp is 194

mommy's hp is now 175       

mommy's hp is now 156       

mommy's hp is now 141       

mommy's hp is now 126       

mommy's hp is now 109       

mommy's hp is now 93        

mommy's hp is now 80        

mommy's hp is now 63        

mommy's hp is now 49        

mommy's hp is now 31        

 

以上、全32回でした。

あっというまですね。2時間ちょっとでコーディングしながら

終わりました。

未熟なのは承知ですが、

これでRubyいけますよと会社でも言えそうです。