webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

ruby

ハッシュにデフォルト値を付けれるって知ってました?!

Effective Rubyの勉強メモです。 Hashクラスのオブジェクトに対して無効キーを渡すとnilが返ってきます。 nilが返ってくることを期待して(利用して)書いたコードもありますが、nilが返ってくるためnilガードで値を設定するコードが増えたり、思わぬところに…

何度見てもよく分からないreduceメソッドをマスターする!

Effective Rubyの勉強メモです。 どう使えばいいのかわからない。使い方もいまいち難しいメソッドの一つにreduce(inject)があります。 コレクションオブジェクトを操作するのにmapやeachはよく使いますが、reduceを使うと要素の合計の計算などmapやeachで書…

Setクラスはこう使え!要素の存在確認をするならSetクラス

Effective Rubyの勉強メモです。 Array, Hashで存在確認する コレクションにある指定された要素が存在しているかどうかのチェックには、通常Array#include?メソッドを使うかと思います。 例えば、次のような権限クラスを考えます。権限クラスはパーミッショ…

至れり尽くせりArrayメソッドで配列に簡単変換

Effective Rubyの勉強メモです。 Rubyではメソッドの引数の型を指定しないため、さまざまな引数が与えられます。 もし配列が引数に与えられることを想定して実装すると、引数に単一のオブジェクトやnilが送られてきた場合に困ってしまいます。 そこで、Array…

コレクションの取り扱いあれこれ

Effective Rubyの勉強メモです。 【目次】 コレクションをメソッドに渡すときの注意 破壊的メソッドを使わない対処法 コレクションをコピーしておく ディープコピーする コレクションをメソッドに渡すときの注意 rubyでは、コレクション(例えば配列)をメソ…

クラス変数の罠。これからはクラスインスタンス変数を使おう

Effective Rubyの勉強メモです。 インスタンス変数とクラス変数 クラス内で@が先頭につく変数はインスタンス変数を表します。 インスタンス変数はオブジェクト一つ一つが持つプライベートな変数です。オブジェクトのあるインスタンス変数に値をセットしても…

秘密のprivateと秘伝のprotected

Effective Rubyの勉強メモです。 オブジェクト指向はカプセル化によって公開するpublicメソッドと非公開なprivateメソッドを分けています。 最初の頃はすべて公開したら後で楽じゃないかって思っていたのですが、公開するものを制限することでテスト対象が減…

あっ!UFO演算子!Comparableモジュールの実装方法をご紹介します。

Effective Rubyの勉強メモです。 13章はUFO演算子とComparableモジュールについてです。 この二つは以前記事にしたことがあるのでササっと流していきます。 www.uosansatox.biz 簡単に言うと、UFO演算子(<=>)を定義するだけでsortやminメソッドが使えるよう…

4つもあるの!!Rubyの等値演算子を徹底解説

変数同士が等しいかどうかRubyで調べる手段をご存知でしょうか。 数値同士、文字列同士なら言わずと知れた==を使えばいいですね。ほかにもRubyにはeql?メソッドなどが存在します。 ですが、すべて同じ結果を返すわけではありません。何をもって等しいとする…

名前の森で定数を見つける物語

Effective Ruby勉強メモです。 Rubyで大きなアプリケーションなどを作る場合には、どうしても既存クラスと同じ名前のクラスを定義したいときがあります。 以下のように書くとクラスを新しく定義しているかのように見えますが、実際には既存のArrayクラスを再…

即席クラス。構造化データの表現にはStructを使おう

配列ではなく、キーと値のペアで構成されているデータを扱うには、普通ハッシュを使うかと思います。 それ自体は間違いではありませんが、ハッシュにしてしまうとゲッターメソッドが使えず、オブジェクトかハッシュかを意識しながら扱わなくてはいけません。…

Rubyをもう一歩進んで勉強する9章(セッターメソッドについて)

Rubyではメソッド名の末尾に"!"や"?", "="のような非英数字文字を使うことができます。 "!"はメソッドの使用者に注意を促すとき、"?"はメソッドが真偽値を返すのを明示的に表したいときに使ったりします。 たまに、"!"を付けると破壊的メソッドになるとか、…

Rubyをもう一歩進んで勉強する8章(initializeメソッドについて)

伝統的かどうかわからないが、RubyはJavaなどにあるようなコンストラクタを持っておらず、代わりにnewメソッドから呼ばれるinitializeという特別なメソッドを定義することによりオブジェクトを初期化することができます。 特に定義しなければ、BasicObjectク…

Rubyをもう一歩進んで勉強する7章(superの挙動)

親クラスの同名メソッドを呼ぶsuperについてです。 例えば以下のような場合 class User def login(acount, password) ~ログイン処理~ end end class AdminUser < User def login(password) ~ログイン処理~ ~固有の処理~ end end AdminUserクラスではロ…

Rubyをもう一歩進んで勉強する6章(メソッド探索と特異クラス)

Rubyでは、継承しているクラスを上へ上へと昇りながらメソッド探索を行います。 一つ上のクラスはsuperclassメソッドで知ることができますが、モジュールをインクルードしたときはsuperclassで検出できず、しかしいつの間にかモジュールのメソッドが使えるよ…

Rubyをもう一歩進んで勉強する5章(Rubyが出す警告について)

Rubyはコンパイルすることなく、即座に実行できる言語ですが、実際は構文解析などコンパイラ的な処理を行ってから実行されます。 コンパイラフェーズで出される警告は特に重要で、その大多数が曖昧な書き方ゆえ、さまざまな解釈の中から一つを選択したときに…

Rubyをもう一歩進んで勉強する4章(Rubyの定数について)

Rubyでは定数を先頭を大文字の変数として定義することができますが、ミュータブル(変更不可)ではありません。 システム全体で定数は変更されないことが期待されますが、イミュータブル(変更可能)となっているので、予期せぬ不具合や見つけにくいバグが生…

Rubyをもう一歩進んで勉強する3章(Perl風機能の排除)

第3章はRubyに残っているPerl風機能を排除(できるだけ使わないようにしよう)です。 Rubyは様々な言語から影響を受けながら作られた言語です。 影響を受けた言語の一つとしてPerlがあります。 僕はPerlを触ったことがなく、初めてRubyを触ったのも2系にな…

Rubyをもう一歩進んで勉強する2章(nilかもしれない運転)

Effective Ruby勉強メモ第2回目です Effective Ruby作者: Peter J.Jones出版社/メーカー: 翔泳社発売日: 2015/01/19メディア: Kindle版この商品を含むブログ (5件) を見る

Rubyをもう一歩進んで勉強する1章(何を真と考えるか)

Rubyにもう少し深く触れるべく、Effective Rubyを少しずつ読んでいこうと思います。 この記事は勉強した際のメモ・感想・まとめです Effective Ruby作者: Peter J.Jones出版社/メーカー: 翔泳社発売日: 2015/01/19メディア: Kindle版この商品を含むブログ (5…

ヘルパーが太ってきたらデコレータでダイエット

画面へ表示するためだけのメソッドは、モデルには書かずに、ヘルパーに書く。というのはみなさんご存知のはずです。 ただ、そうすると今度はヘルパーが太ってくる。 最初はそこまで多くならないだろうと、一つのファイルに集めていたヘルパーメソッドたちが…

inverse_ofってどういうときに使うの?

Rails Guide の説明では 「inverse_ofオプションを提供していて、これを使うと双方向の関連付けを明示的に宣言することができます。」 とありますが、正直言ってることがよく分からんという方、そして自分へのメモです。 例えば、次のようなモデルのとき (…

最大値よりちょっと大きくてキリの良い数値を出力せよ

ここに、ユーザー登録数の推移が配列であります。[12,45,112,345,343,340] これをグラフに表示する際に、配列の最大値より少し大きくてキリの良い数を出力したい。 そんな要望があったときの実装例です。 def user_count_upper_bound(array = [0]) upper_lim…

【Ruby】UFO演算子を定義して、sortやminメソッドを使えるようにする

こんにちは、さもです。 UFO演算子というのがRubyにあるのはご存知でしょうか? <=> こういうやつです。比較演算子をまとめたような「<=>」が一つの演算子になっています。 RubyではこのUFO演算子を任意のクラスで定義しておくと、そのクラスのインスタンス…

Rubyでフォルダ内のファイルをpost送信する

こんにちは、さもです。 動画投稿webサービス作ったはいいけど、手元のファイルすべてをポチポチと画面からアップロードするのめんどくさいな ってときありますよね。 先日こういうのを作ったので必要になりました。 www.uosansatox.biz そんな要望にお答え…

今日学んだこと。日時の比較やalias_methodなど

こんにちは、エンジニアのさもです。 今回は今日学んだことを忘れないようにするためのメモです。 [Ruby]文字列と日時の比較 [Ruby]alias_method [CSS] inherit [Jquery]eq(position)

herokuでbundle installが実行されない

こんにちは エンジニアのさもです。 herokuにdeployしたとき、なぜかbundle installが実行されていないようだったので、メモです。 (よくある原因のひとつに、開発環境でbundle installしていなかったというがありますが、今回はこれが原因ではありませんで…

Rubyの3つドットで指定する範囲([1...4]等)はいつ使うか

こんにちは、エンジニアのさもです。 普段Rubyを使っている方や、Rubyを使い始めた方もuser_list[0..3]のように配列に対して範囲を指定できることはご存知かと思います。 一方、user_list[0...3]のように3つドットを使うとindexが0から2(3は含まない)の範…

Rubyでどう書く?配列からターゲットの周囲5件を抜き出す

こんにちは、エンジニアのさもです。 仕事で次のような要件のメソッドを実装しました。 配列[1,2,3,4,5,6,7,8,9]がある。 この配列から、指定した数字(実際は検索結果の配列に対して、一つのオブジェクトを指定)を含む周囲5件を抜き出した配列を作る (具…

Rails入門者のためのQA~例外処理~

こんにちは、エンジニアのさもです。 2回目にしていきなり例外処理です。しかもQAじゃないです(笑) 入門したては、ガンガン機能を追加していき、サイトを作りこんで行きたいかと思うのですが、少し立ち止まって、例外処理について学んで下さい。 一度書く…