ドットインストールを見ながら勉強したノートです。
.rbのファイルををコピペしてるので、表示がちょっと変かも
(scivolaさんに教えてもらって、表示が改善されました。ありがとうございます。)
puts "Hello World!"
=begin
実行方法
その1
Interactive ruby irb
irbで返り値を表示するのはirbの機能
exit
その2
ファイルに書き込んで
ruby hoge,rb で実行
;で区切ると1行内に複数書ける
=end
# 出力
print "hello world(print)"# 終わった後に改行がない
puts "hello world(puts)"#改行がある文字列に変換する
p "hello world(p)"#データ形式がわかる クォートで囲んであって文字列とわかったりする
# 変数:データにつけるラベル
msg = "hello world"# 英小文字始まり 全部小文字で書くことが一般的
puts msg
# 定数:変更されないデータにつけるラベル(これは変更されると困るというもの)
ADMIN_EMAIL = "info@gratitude-happy.com"
=begin
英大文字始まり。最初が大文字なら定数と認識されるけど基本全部大文字で書くよ。
値を後から変更しようとするとwarningがでるよ
データ(全てオブジェクト)
オブジェクト→いろんな便利な命令(=メソッド)が詰まったデータ型くらいの認識でオッケー
=end
# メソッド(クラスで定義)
p "hello world" .length #11 スペースもカウントする
=begin
クラス=オブジェクトの設計図のようなもの、全てのデータはなんらかのクラスに属している。
文字列 - stringメソッド(ruby コアリファレンスに入っている)
シングルでもダブルでもどちらでも文字列になります。 `#{}` はダブルの場合のみ展開されます
数値オブジェクト-Numerinクラス
=end
x = 10 #_を無視するので桁が大きい時は100_000_000
y = 20.5
z = Rational(1,3)
puts x,y,z
p x % 3
p x ** 3
p z * 2
p x += 5
p y.round
#文字列オブジェクト
name = "Rumiko Nishikawa"
x = "hello\tworld,\n #{name}"
y = 'hello\t world, \n#{name}' #こっちはつかえない
z = "hello world\t"
puts x
puts y
#文字列連結 + 繰り返し *
puts z + name
puts z * 5
=begin
メソッド
! 破壊的メソッド 元データも書き換えてしまう
? 真偽値を返すメソッド true false
=end
puts name.upcase
puts name
puts name.upcase!
puts name
p name.empty? #空文字かい?
#配列オブジェクト コアリファレンス Array参照
sales = [5,8,4]
p sales[2]
sales[1]=10
p sales[1]
p sales[0..2] #0から2まで
p sales[0...2]#0から2未満
p sales[-1] #配列の一番最後
p sales[1, 2]#配列の"1"番目から2個分
sales[0...2] = [1, 2]#配列の0~2未満の数字を1,2に書き換える
p sales
sales[1,0] = [10, 11 , 12]#添え字の1から0個分のところに10,11,12を入れる
p sales
sales[0, 2] = [] #0から2個分を空配列にする
p sales
p sales.size#配列の要素数
p sales.sort#配列のソート
p sales.sort.reverse#配列のソート逆順 メソッドはつなげられる
p sales.push(100) #配列の末尾に100を追加
#sales <<101 <<102 #pushのショートカット末尾に101 102を追加
p sales
#ハッシュ key value
sales = {"yamada" =>200, "tanaka" =>3000}
p sales["yamada"]
#シンボルを使うこともできる シンボル-識別子として使えるオフジェクト
#文字列を使うより動作が速い
sales = {:yamada =>200, :tanaka =>3000}
sales = {yamada:200, tanaka: 3000}
p sales[:tanaka]
p sales.size
p sales.keys
p sales.values
p sales.has_key?(:yamada)
#オブジェクトの種別変換
a = 10
b = "5"
p a + b.to_i #int に変換
p a + b.to_f
p a.to_s + b
h = {yamada: 100, tanaka: 200}
p h.to_a #配列に変換
p h.to_h #ハッシュに変換
#%記法
s = "hello"
s = %Q{hello} #記号か()だったらなんでもよい !! {} ??でも
s = %(hello) #Qは省略できる
s = %(hell"o)
# でエスケープしなくてもオッケー
# s = 'hello'
# s = %q(hello)シングルクォーテのときは小文字q
p s
puts s
b = ["a" ,"b" ,"c" ]
a = %W(a b c) #空白区切りで書く
#b = ['a' ,'b' ,'c' ]の場合は
#b = %w(a,b,c)と書く
p b
p a
#文字列や配列だと""をたくさん打つことになるので%記法も便利
score = 50
if score > 60
puts "ok!"
elsif score >40 #"elsif"の綴りに気を付けよう
puts "soso..."
else
puts "NG!"
end
=begin
比較演算子
><
>= <=
== !=
&&
||
!
=end
score = 90
puts "great!"if score > 80 #後にif文をつなげることができる
if x # ==true省略
puts "..."
end
=begin
false: false nil
true: それ以外(0 ''を含む)
if条件
a = b
else
a = c
end
a = 条件 ? b : c
=end
b = 10
c = 20 # b, c = 10, 20 と一気に代入できる 多重代入
a = b > c ? b : c
# bがcより大きかったらbを返して そうでなければcを返しての意
puts a
=begin
# unless
a = 1
unless a == 0
puts "aは0ではありません。"
end
a = 1
if a != 0
puts "aは0ではありません。"
end
条件分岐 case
case 比較したいオブジェクト
when 値
処理
when 値
処理
when 値
処理
else 処理
end
=end
signal = "blue"
case signal
when "red"
puts "stop!"
when "green","blue"
puts "go!"
when "yellow"
puts "caution!"
else
puts "wrong signal"
end
#roop処理
#timesメソッド
#while文
3.times do |i|
puts "#{i}:hello"
end
# upto メソッド
#数値を指定した範囲内で変化させながら処理を実行する
1.upto(10) do |n|
puts "■" * n
end
1.upto(10) do |n|
puts "■" * (n * 3)
#改行スペースシビアなので気を付ける
end
#|i|で何回目の処理なのかをとることができる。0始まり
i = 0
while i < 3 do
puts "#{i}:hello"
i += 1
end
#break:ル:ープを抜ける
#next:ループをスキップ
3.times do |k|
if k == 1
#break 0回目のループで終わる
next puts "スキップしてるよ"
end
puts "#{i}:good"
end
#for
for i in 0..2 do
puts i
end
#for文は配列も扱えるよ
for color in ["red","blue","pink"] do
puts color
end
#eachメソッド 配列バージョン
["momo","suika","kaki"].each do |fruit|
puts fruit
end
#eachメソッド ハッシュバージョン
{"momo"=>200, "suika"=>1000 ,"kaki"=>300}.each do |fruit, price|
puts "#{fruit}:#{price}"
end
#[]で囲むと配列で出力されちゃうよ{}で書こうね
#関数的メソッド
#defで呼び出して 定義する
def sayHi
puts "hello!"
end
sayHi()
#アレンジ
def sayHiname(name="ななし")
puts "hello! " + name + "さん"
end
sayHiname("tanaka")
sayHiname("katou")
sayHiname()
#返り値 を持たせる
def sayHiname2(name="hoge")
s = "hello! " + name + "さん"
return s
end
greet = sayHiname2()
puts greet
#メソッドの中で宣言された変数は外からアクセスできない。アクセスするとundefined言われちゃうよ。
#クラス(オブジェクトの設計図)この中でメソッドの定義をしていく
#クラスから作られたオブジェクトのことをインスタンスと呼ぶ
class User #クラス名は必ず大文字から始まる
@@count = 0 #クラス変数
def initialize(name)
#クラスからオブジェクトを作るときに必ず実行される初期化処理
@name = name
#@から始まるものはインスタンス変数と呼ばれる
@@count += 1
#初期化される度にカウントを1ずつ増やす
end
def name
return @name
end
def setName(newName)
@name = newName
end
def sayHello
#クラスの中でメソッドを定義する→インスタンスから呼び出すことができるインスタンスメソッドという
puts "hello,my name is #{@name}"
end
def User.sayfrom #クラスメソッド
puts "hello from User class(#{@@count}users)"
end
end
class SuperUser < User #Userのクラスを継承して拡張できるよ
def shout
puts "HELLO! from #{@name}! I'm SuperUser!"
end
end
User.sayfrom()#クラスメソッドの実行
tom = User.new("tom")
bob = SuperUser.new("bob")
#インスタンスを作るときの決まり文句は.new
tom.sayHello()
bob.sayHello()
bob.shout()
User.sayfrom()
#bobさんはUserを継承したSuperUserなのでsayhelloもshoutも使えるけど
#tomさんはUserなのでshoutするとundefined言われちゃうよ
#アクセサ
=begin
基本クラスの外からインスタンス変数にアクセスできない
アクセスしたいときは別途メソッドを書く
例:
取得する方 getter
def name
return @name
end
設定する方 setter
def satName(newName)
@name = newName
end
合わせてアクセサという
一気にアクセサを生成するには
attr_accessor :name シンボルでインスタント変数の名前を与える
attr_reader :name #getterだけ
attr_writer :name #setterだけ
アクセサを使えば
kana.setName('momo')も簡単に
kana.name = 'momo'と書ける
=end
kana = User.new('kana')
kana.sayHello()
p kana.name
kana.setName('momo')
p kana.name
kana.sayHello()
#timeクラス
t = Time.now #クラスなので大文字始まり
t = Time.new(2016, 2, 8, 7, 00, 10)
p t.strftime("Updated:%y-%m-%d")
p t
p t.year
p t.month
t += 10 #秒単位で四則演算することができる
#ほかコアリファレンスのTimeクラス参照
p t
class Shop
attr_accessor :name
#シンボルの:の後スペースを空けない
def initialize(name)
@name = name
end
def print_details
puts "shop:
#{name}
"
end
end
module AnimalModule
attr_accessor :animals
def print_animals
puts "animals :
#{animals.join(',')}
"end
end