たのしいRubyを勉強してみた 第一部
Green_helmet@bethlehem4099 2022年6月18日
Rubyの本、買ってきた。たのしいRuby、勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
参考文献
この記事は以下の情報を参考にして執筆しました。
-たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年
-『たのしいRuby 第6版』サポートページ、ソースコード
はじめに
ここのところPythonでプログラムを書いていた。
でも、Pythonは計算は得意だがまとまったプログラムを作るのには向いてない気がしてRubyを勉強することにした。
もう一つは、Ractorと言う並列処理の機能がRubyに出来たと聞いたからだ。
そう、PythonはmacOSのプリインストールソフトから削除されてしまったがRubyは残っている。そしてGitHubとHomebrew最高。
Rubyの実行環境とインストール
パソコン環境
Ruby勉強の環境。二画面で実行環境と本や検索画面を表示出来て快適。でもM1 MacBook Airは接続できる外部モニターがデフォルトで1台なんだよな。だからIntel MacBook Proの出番がまだある。ただし動作は圧倒的にM1が快適。この構成に至るまでかなり試行錯誤した。
Intel MacBook Pro 2017,
M1 MacBook Air 2020,
LG 27inch monitor 4K, Sony 2k TV,
Logitech keyboard M380,
MX Anywhere 3 for Mac mouse
Windowsパソコン(第11世代のCore i5)も持っているが、CPUがIntelのパソコンとApple silicon Macを比較するといわゆるM1とかを搭載したパソコンの方が圧倒的に早くて快適だった。これは1CPUの能力の差なのでCPUコアの数が多くても体感は変わらない。HomebrewがWindowsには無かったので設定が面倒でWindowsにはRubyをインストールだけして使うのをやめてしまった。
Linux、なにそれ美味しいの?
モバイル環境
iPad 9, iPhone XR, iPhone SE2
スタバでRuby、電車でRuby、寝床でRuby用。
Green_helmet@bethlehem4099 6月21日
ソフトウエア
ターミナル、Command Line Tools、Homebrew、Ruby、CotEditor
ここに書いたソフトがこの順番で必要だがOSのバージョンやCPUの種類によって最初から入っているソフトがあるかもしれない。自分のMacではターミナルはLaunchpadにあったが、Command Line Toolsは無かった。インストールのやり方はここに出てきた単語をブラウザで検索してそれに従う。Homebrewが使えるようになるとあとは簡単。難しいことは無いがやり方を検索しながらのダウンロード・インストールに半日くらいかかった。
最後のCotEditorはApp storeからインストールした。軽くて見た目が綺麗な無料エディタ、文字コードの変換とか強い。
Vimねぇ、esc : wq! の呪文を知らないとパーティ全滅の憂き目にあう。
VScodeは一応入れてある。
Rubyist
iPhone、iPadのApp storeストアで購入、モバイル用
でははじめよう
新しい言語を勉強しようと思うとインストールが一番の難関だったりする。ここまで来れば勉強の半分は終わっている。
さて、この本ではプログラム言語Rubyの実行環境としてコマンドラインからrubyを起動する方法とirbを紹介している。
プリント print
MacのLaunchpadにあるターミナル>_
アイコンをクリックして起動し、さらにプロンプト~ %
(自分のMacBook Proではこれ)の右側にirbと呪文をタイプしてリターンを押してirbを起動する。これをコマンドラインというが実は正統派UNIXだったりする。
ふんふん、Rubyはprintで文字書くのね
irb(main):001:0> print("Hello, ruby.\n")
Hello, ruby.
=> nil
ここで固まった。
irbは何故=> nil
を表示するのか謎。
なんと言うか、結果を印刷するだけでは無く式の戻り値も表示しているみたいだが、最初から混乱する。これからは=> nil
は見ないことにする。
あとnil
って何だ?
答え、nil
は何も無い、NaN
と同じ。
Green_helmet@bethlehem4099·6月22日
print, puts, p
つぎ。
何とRubyは印刷だけでprint, puts, pの3つもやり方がある
~ % irb
irb(main):001:0> print("Hello, Ruby")
Hello, Ruby=> nil
irb(main):002:0>puts("Hello, Ruby")
Hello, Ruby
=> nil
irb(main):003:0> p("Hello, Ruby")
"Hello, Ruby"
=> "Hello, Ruby"
おまけに、()有りと無しが可能で6通り
irb(main):004:0> print"Hello, Ruby"
Hello, Ruby=> nil
irb(main):005:0> puts"Hello, Ruby"
Hello, Ruby
=> nil
irb(main):006:0> p"Hello, Ruby"
"Hello, Ruby"
=> "Hello, Ruby"
さらにRubyでは文字列を囲むのにダブルクォート""とシングルクォート''を使える
この例だとどちらもダブルクォートが表示される。
irb(main):007:0> print('Hello, Ruby')
Hello, Ruby=> nil
irb(main):008:0> puts('Hello, Ruby')
Hello, Ruby
=> nil
irb(main):009:0> p('Hello, Ruby')
"Hello, Ruby"
=> "Hello, Ruby"
irb(main):010:0> print 'Hello, Ruby'
Hello, Ruby=> nil
irb(main):011:0> puts 'Hello, Ruby'
Hello, Ruby
=> nil
irb(main):012:0> p 'Hello, Ruby'
"Hello, Ruby"
=> "Hello, Ruby"
微妙に違う。
まあ要約すると、
()は有っても無くても良く、
printは改行が無く、
putsは改行があり、
pは"がそのまま出力され、'は"に変換されて出力されている。
う〜ん、これはもうRubyはあれである、あれ
Rubyはコンピュータ言語界の一蘭
天然とんこつラーメン専門店 一蘭 >(@ICHIRANJAPAN)/Twitter
「とんこつラーメン発祥の地(聖地) 福岡県にて昭和35年創業」
一蘭ラーメンを知らない人のためにお伝えすると、一蘭はトッピング全てを食べる人の好みに合わせて選択可能なのである
選べるのは味の濃さ、こってり度、にんにくの量、ネギの種類と有無、チャーシュー(焼き豚)の有無、秘伝のたれの量、麺のかたさ、さらに替え玉の有無など、そしてとても美味しい
Green_helmet@bethlehem4099·6月23日
Pythonは東京醤油系ラーメン言語
醤油ラーメンのトッピングはメンマとナルト、ねぎ、半熟卵、ほうれん草、チャーシュー、海苔に決まっている。オプションは無い(偏見)
これも美味しい。東京醤油系ラーメンのおすすめのお店。
onochan.jp
十条「玉屋」誰もが「懐かしの東京醤油ラーメン」というけど、
そんな短略的なものじゃない。このラーメンは何気ない振りを装っているけど、
洗練された味わいが潜んでいる。
- 元祖 カレー研究家 小野員裕
Green_helmet@bethlehem4099·6月23日
C++はラーメン二郎系マシマシ言語
ラーメン二郎、出典: フリー百科事典『ウィキペディア(Wikipedia)』
ja.wikipedia.org、ラーメン二郎 - Wikipedia
Green_helmet@bethlehem4099·6月24日
pの感想
Rubyのpは良いな
デバッグの時に変数aを表示するのに
>p a
1
でいける
>print(a)
1
>printf("%d",a);
1
あと、いつも書式を書くのが面倒だと思っていたので
>q a
a=1
とか作ってくれないだろうか。
メソッド
ところで、自分はprintメソッドという名前に違和感があるな
メソッドはクラスの定義の時に使うのではないか?
もしかしてクラスメソッドかな、それともインスタンスメソッドでコンストラクタを隠しているのか
それにRubyには関数がないのか
Green_helmet@bethlehem4099·6月25日
「日本語の表示」
学習のスタイルとして教科書の例題を見て適当に変えて自分でタイプして実行してみることにする。あと=>がわずらしいのでirbを使うのはやめて、拡張子が.rbのテキストファイルをCotEditorで作り、コマンドラインからRubyを実行するにやり方を変えた。そう、テキストファイルを保存する場所はMacintosh HDの中のユーザの中の自分の名前のフォルダだった。
print "春はあけぼの。やうやう白くなりゆく山際、\n"
print "少し明かりて、紫だちたる雲の細くたなびきたる。\n"
コマンドラインから実行する。なお、➜ ~は自分のパソコンのコマンドプロンプト。
➜ ~ ruby makurano.rb
春はあけぼの。やうやう白くなりゆく山際、
少し明かりて、紫だちたる雲の細くたなびきたる。
最新のmacOSで文字化けしない。偉い。
M1 MacBook Air, macOS Monterey 12.4
Green_helmet@bethlehem4099·6月25日
「数学的な関数」ちゃんと動く
include Math
a=cos(PI/2)
b=sin(PI/4)
c=sqrt(2)
print "cos(PI/2)=",a,"\n"
print "sin(PI/4)=",b,"\n"
print "sqrt(2)=",c,"\n\n"
➜ ~ ruby math.rb
cos(PI/2)=6.123233995736766e-17
sin(PI/4)=0.7071067811865475
sqrt(2)=1.4142135623730951
Green_helmet@bethlehem4099·6月26日
「コメント」
=begin
「コメント」
「コメント」
「コメント」
=end
はい
「制御構造」
if then else end, while do endはお馴染み
3.times doは目新しい
3.times do
puts "ジャック、食べてばかりで運動しないとチー牛になるよ。"
end
➜ ~ ruby betty.rb
ジャック、食べてばかりで運動しないとチー牛になるよ。
ジャック、食べてばかりで運動しないとチー牛になるよ。
文字数・・・
#大事な事なので3回言います
Green_helmet@bethlehem4099·6月26日
「便利なオブジェクト」の章に進もう
ArrayはC言語の配列とは違ってコンテナだな
int、double、str とか何でも入れられる。
Green_helmet@bethlehem4099·6月26日
シンボルは新しい。コロンはfooや"foo"から離してはいけない
sym = :foo
sym2 = :"foo"
sym_s = sym.to_s
sym2_s = "foo".to_s
puts sym, sym2
puts sym_s, sym2_s
Hashは辞書型か
# hash.rb
adress={name:"松本", furigana:"マツモト"}
p adress[:name]
p adress[:furigana]
% ruby hash.rb
"松本"
"マツモト"
う〜ん、混乱するな
パターンマッチング
p /パターン/ =~ "マッチングしたい文字列"
p /Ruby/ =~ "Yet another ruby newcomer"
p /ruby/ =~ "Yet another ruby newcomer"
p /Ruby/i =~ "Yet another ruby newcomer"
nil
nil
12
12
何文字目で一致したかがわかる。
コマンドラインの引数を整数計算
# arg_arith.rb
num0=ARGV[0].to_i
num1=ARGV[1].to_i
puts "#{num0}+#{num1}=#{num0+num1}"
puts "#{num0}-#{num1}=#{num0-num1}"
puts "#{num0}*#{num1}=#{num0*num1}"
puts "#{num0}/#{num1}=#{num0/num1}"
➜ruby arg_arith.rb 5 3
5+3=8
5-3=2
5*3=15
5/3=1
Green_helmet@bethlehem4099·7月2日
テキストファイルも読める
まあ、C言語を使ったことがあればごく普通
# read_text.rb
file_name=ARGV[0]
file=File.open(file_name)
text=file.read
puts text
file.close
Green_helmet@bethlehem4099·7月6日
つぎ
GREP
関数をライブラリ化
# simple_grep.rb
def simple_grep(pat, filename)
pattern=Regexp.new(pat)
file=File.open(filename)
file.each_line do |line|
if pattern =~ line
puts line
end
end
file.close
end
# use_grep.rb
require_relative 'simple_grep'
simple_grep(ARGV[0], ARGV[1])
この2つのファイルを作り、ユーザの中の自分のログイン名のフォルダに保存する。
~ % ruby use_grep.rb "line" simple_grep.rb
file.each_line do |line|
if pattern =~ line
puts line
コマンドラインでパターン"line"とファイル名simple_grep.rbを指定して上記のように実行する。うん使いやすい。
これで「たのしいRuby」の第一部終了
Green_helmet@bethlehem4099·7月7日