プログラミング備忘録

プログラミングの学習状況をメモしています

39日目

今日の学習

Ruby

昨日から引き続き、Railsチュートリアル第4章 Rails風味のRubyの部分を学習する。

Railsの教材だが、Rubyの機能を中心にしている章なのでRubyカテゴリでメモ。

Railsチュートリアルの第4章のみ、動画教材を視聴できるようだがとても分かりやすい。次章から購入しないと動画が見られないのは残念だが、Ruby(というかプログラム)と対話するとはどういうことなのか、コンピュータ側から見てプログラムはどう見えているのかという視点で見ていくことが新鮮で面白かった。

putsの戻り値はnil
[1] pry(main)> puts "foo"
foo
=> nil

pryでputsを使ってみると、=> nilと出てくる。

この=>の部分は、戻り値を表示するというらしいが、自分はこれまでputsの戻り値はputs以降に入力した文字列のことだと思っていた。

https://wa3.i-3-i.info/word15003.html

いつもIT系の用語を調べるときにお世話になっているサイト。

確かに、改めて考えてみると、戻り値として文字列が返ってきているわけではないか。

putsでnilが返ってくる。これの意味は? - Qiita

戻り値はnilだと知って、そうだったのか?となったのでメモしておく。あまり深く考えずそういう仕様だと大雑把な理解で大丈夫そうだ。

オブジェクト指向

「例外が非常に少なく、オブジェクトとメッセージの受け渡しだけでほぼ全てのことを表現できる」という説明がすっと頭に入ってきた。

オブジェクトに対して、メソッドとして問いかけると、確実に何らかの回答が返ってくる。

Rubyという言語の柔軟性というか、人間の表現に寄り添ってくれている構成を見て、Rubyからプログラミングの学習を始めて良かったと感じた。

作成するメソッドは、他の人が使う際にもすぐに分かりやすいように、違和感のないような名前をつけたりすることを心がけることで、Rubyの良さを活かすことができる。

データ構造
[3, 10, 7].sort
=> [3, 7, 10]

[3, 10, 7, "foo", "bar"].sort
=>ArgumentError: comparison of Integer with String failed

上のような場合だと、コンピューター側がある程度どうすればようか推測して値を返すことができるが、下のように数字と文字列という異なった形式のものがある場合はどのようにすればいいかの判断が自動で下しにくいため、エラーが返ってくる。

さまざまなパターンが考えられる場合は、コンピュータが処理できないという表れだという。

ブロック

ブロックの扱いが下手で、どういうときにブロックを扱うのかが身に付いていない。

「引数を渡すところに、ソースコードをそのまま入れることができる」ものがブロック、という説明が非常に分かりやすかった。

それから、意識したことがなかったことなのだが、

  resources :posts do
    resource :likes, only: [:create, :destroy]
  end
 test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

上記のようなコードも、ブロックを使用している。

メソッド名(引数)(sum(1, 5)のような)という記述ばかり普段しているので、引数のかっこを外してもよいということをつい意識せずに見てしまう。

下のコードで言うところの"should get home"testメソッドの引数であり、ただ単純にかっこを省略して書かれているだけだ。

この書き方をすればよいということはお手本を見れば分かったが、doは一体なんなんだろうとずっと思っていた。

なぜなら、ブロックといえば| |で囲うものだという思い込みから、これがブロックを用いたコードだという見方ができていなかったからだ。

どうやら短い1行のブロックの際にはそうであるが、基本的にdo以下のものが全てブロックということになる。

つまり、resourcestestもブロック付きのメソッドだ。

そのため、上のコードではresource :likes, only: [:create, :destroy]がブロックの要素であり、

下のコードではdo以下3行のコードがブロックの要素になる。

下のコードは、testが実行されるときにブロック内の文が実行されるということになる。

ハッシュでシンボルを使う利点

ハッシュは、以下のどちらでも同じ意味になる。

{ "name" => "長谷川" }
{ :name => "長谷川"}

ハッシュに対してシンボルを使うと処理が早くなる、というのは何度か目にしたことのある話だが、Railsチュートリアルでの解説を聞いて、理由が具体的に分かったのでメモ。

オブジェクトには、オブジェクトIDというものが割り振られており、object_idメソッドを利用することで知ることができる。オブジェクトがどこの場所に格納されているか、という理解をする。

数字は決まった場所にあるため、いつでも同じ数値が返ってくる。

f:id:hasegawa_note:20210610221504p:plain

(最初にこれを見たとき、1のidが3で分かりづらいなと思った)

では、上の例にある"name"はどうなるだろうか。

f:id:hasegawa_note:20210610221931p:plain

数値が変わっているのが分かる。文字列の場合は、呼び出された時々に応じてidが変化する。

一方で、ハッシュの場合はどうなるか。

f:id:hasegawa_note:20210610222106p:plain

常に同じidが返ってきている。数字と似ている性質に変化している。

そのため、文字列は毎回データの場所を探しにいく必要があるが、ハッシュのような状態だと毎回同じ場所を参照するだけで済む。

コンピュータにとって分かりやすい上に、人間にとってもぱっと見て情報が分かりやすいというものになる。

整数と同じような性質を持った、可読性のあるオブジェクトがシンボル、ということだった。

Ruby on Rails

ヘルパーモジュール

Railsでは、自動的にヘルパーモジュールを読み込んでくれるため、ヘルパーメソッド、カスタムヘルパーをミックスインしなくても構わない。

Rails風味のRuby

Rubyでは使えないが、Railsで用意されているメソッドが存在する。

activesupportというgemで利用できるようになっている。

これまで使っていたpresent?メソッドなどがそのようだ。

empty?とblank?
"     ".empty?
=> false
# 空白スペースが一つでもあれば、それは空ではない。

"     ".blank?
=> true
# 空白スペースの集合を空としたいときに使えるメソッド
# Rubyでは使えない

余談

とてつもない余談だが、だいぶ昔にfoobar2000というフリーソフトを使用したことを思い出した。

今日、fooとbarを並べてみて、既視感がある...と感じたがすっきりした。

かなり特殊な拡張子のファイルを再生するときに使った気がする。