americandog1993の日記

プログラマー歴半年のメモ

SAMインターフェースのメソッドは一つだけ

SAMインターフェースは一個のメソッドしか定義できない。

interface MyFunction {
  int call(int x);
}

インターフェース型変数にメソッド参照を入れるの慣れない。
直感的に捉えられる日は来るのだろうか。

参考:
【Java】Java8のあれこれ③ 関数型インターフェース(1) | Ardito Tech Blog

If分岐を多態性で簡潔に

条件分岐で中身が冗長になったら多態性を使ってまとめてみる。
分岐のそれぞれの処理がある程度共通化できることが前提。
なんとなくJavaで。

exampleSuperClass esc;
if isThing == true {
  exampleSuperClass = new exampleClassA();
} else {
  exampleSuperClass = new exampleClassB();
}
exampleSuperClass.doAnything;

すっきり見やすい。
処理が増えたらメソッドを増やせばいい。
なかなか可読性・メンテ性・拡張性に優れた手法に思える。

Ruby inspectとp

.inspect忘れそうなのでメモ。

foo = "foo"
puts foo.inspect
p foo

puts .inspectの省略として用意されてるのがp。

参考:
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Ruby ハッシュのデフォルト値

ハッシュの存在しないキーのデフォルト値について。

exampleA = {}
p exampleA[:foo] # -> nil

exampleB = Array.new
p exampleB[:foo] # -> nil

exampleC = Array.new(0)
p exampleC[:foo] # -> 0

newした時の引数にデフォルト値を設定できる。
何もしなければnil
普通にexample = {}で宣言した時にデフォルト値を渡す方法はあるんだろうか・・・

参考:
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Rails routesにresourcesは要らない?

routes.rb

Rails.application.routes.draw do
    resources :static_pages, :users
    root 'static_pages#home'
    get 'static_pages/home'
    get 'users/login'
    post 'users/admin'
    get 'users/logout'
end
$ rails s

この状態でstatic_pages/home見に行ったらエラーが出た。

Unknown action
The action 'show' could not be found for StaticPagesController

うーん、となっていたがrailsチュートリアルを読み返しresource使ってないなと気づく。
resource行を消すと解決した。

Rails.application.routes.draw do
    root 'static_pages#home'
    get 'static_pages/home'
    get 'users/login'
    post 'users/admin'
    get 'users/logout'
end

ドットインストールではresourcesを使っていたのだけど・・・
自分でガンガン設定していく場合は喧嘩するのだろうか。
エラーメッセージもshow使えみたいな感じだったし。

参考:
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
ドットインストール Rails入門

HerokuでBuild FailedしたらGemfileを見る

ドットインストールRails入門のTaskAppができた。
ためしにHerokuにあげてみようと

$ git push heroku master

したらBuild Failedしたのでメモ。

少し前なら折れていたが・・・多少メンタルが強くなったのか、エラーメッセージを漁ってみた。

remote:        checking for sqlite3.h... no
remote:        sqlite3.h is missing. Try 'brew install sqlite3',

HerokuはPostgreSQLをサポートしている。
僕があげようとしていたGemfileはsqliteを入れることになっていたのでこんなエラーが出たんだろう。
sqliteをpgに入れ替えて再度pushしたら無事デプロイできましたとさ。

作ったTaskApp
https://ancient-sea-24379.herokuapp.com/


追記:
migrate忘れてた。

$ heroku run rake db:migrate

参考:

http://tech.gmo-media.jp/post/42344727734/starting-rails-on-heroku-01
tech.gmo-media.jp

Rails generateを間違えたときのdestroy

$ rails generate model hooge

名前を間違えて作ってしまったら。
destoryで消してやり直せる。

$ rails destroy model hooge
$ rails generate model hoge


参考:
d.hatena.ne.jp
qiita.com