ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

ruby

Ubuntu 14.04にRuby on Railsを導入する

前提 Ruby 2.2.3が導入済み 導入 sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev …

Ubuntu 14.04にrbenvでRuby 2.2.3をインストールし、Ruby/Tkを有効にする

Ubuntu 14.04環境にて、rbenvで普通に(特にオプションなどを指定せずに)Rubyをインストールすると、Ruby/Tkが有効にならないようです。以下の操作で、Ruby/Tkを有効にした状態でインストールできました。 $ sudo apt-get install -y libreadline-dev $ sudo …

Ubuntu 14.04 + Ruby 2.1.3でcursesを使う

Rubyのcursesモジュールを使ってみたい、ということでインストールしました。 sudo apt-get install libncurses5-dev libncursesw5-dev gem install cursesところが、これでUTF-8の文字列を表示されると文字化けしてしまいました。。 悩んだ結果、libncurses…

Ubuntu 14.04にrbenvでRubyをインストールする

まずはrbenvをインストールします。 git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc rbenv --version続いてruby-bu…

コラッツの問題をRubyで実装してみる

勉強がてら書いてみる。 def collatz count = 0 func = Proc.new do |n| if n == 1 then count else count += 1 if n.even? then func.call(n / 2) else func.call(n * 3 + 1) end end end end (2..10000).each do |i| puts collatz.call(i) end 恥ずかしな…

Rubyの大域脱出(throw-catch)

throw-catchで大域脱出ができるらしい。 # coding: utf-8 str = catch :escape do loop do puts "ループ1" loop do puts "ループ2" throw :escape, "脱出" end end end puts str 実行結果は以下のとおり。 $ ruby throw-catch.rb ループ1 ループ2 脱出

Rubyでコマンドライン引数を解析する

OptionParserってのを使うと簡単らしいです。 # coding: utf-8 require 'optparse' def cmdline args = {} OptionParser.new do |parser| parser.on('-f', '--foo', '真偽値オプション') {|v| args[:foo] = v} parser.on('-b VALUE', '--bar VALUE', '引数付…

クラス変数とクラスインスタンス変数の違い

クラス変数は継承される。 クラスインスタンス変数は継承されない。 # coding: utf-8 class Foo # クラス変数 @@var1 = 123 # クラスインスタンス変数 @var2 = 456 def self.var1 @@var1 end def self.var2 @var2 end end class Bar < Foo end p Foo.var1 p …

Rubyはクラスもオブジェクト

# coding: utf-8 class Foo def hello puts "hello" end end # クラスオブジェクトを変数に代入 a = Foo obj = a.new obj.hello 実行結果は helloです。

Rubyのインスタンスメソッド優先順位

上から順に探索される。 1. 特異メソッド 2. そのクラスで定義したメソッド 3. includeしたmoduleで定義したメソッド 4. スーパークラスで定義したメソッド

Rubyのprivateメソッド

Javaのprivateメソッドは「自クラス内でしか呼び出しができないメソッド」ですが、Rubyでは「レシーバを付けた呼び出しができないメソッド」です。あくまでそれだけです。自クラス外からも呼び出しができます。 # coding: utf-8 class SuperClass private de…

Rubyのexit関数

Rubyのexit関数はSystemExit例外を投げます。 begin exit rescue StandardError puts $!.class rescue SystemExit puts $!.class ensure puts "ensure" end puts "end" 実行結果は以下のとおり。 SystemExit ensure end

Rubyのクラス変数は、継承関係にあるクラスで共有される

class Super @@x = 1 def self.x @@x end end class Sub < Super @@x = 2 end p Super.x 実行結果は以下のとおり。 2

Rubyでは、あるクラス内で他クラスのクラスメソッドを定義できる

こんなこともできるんですね。 class Foo end class Bar def Foo.foo puts "foo defined in Bar" end end Foo.foo 実行すると $ ruby other_class.rb foo defined in Bar

Rubyの文字列比較(eql?とequal?)

eql?は文字列の内容が等しい場合にtrueになる。 equal?は同じ文字列を参照している場合にtrueになる。 a = "abcd" b = "abcd" puts a.eql?(b) # true puts a.equal?(b) # false

Ubuntu 13.10 + Ruby + SQLite3

Ubuntu 13.10で↓をやると怒られた。 $ sudo apt-get install sqlite3 $ sudo gem install sqlite3-ruby Fetching: sqlite3-1.3.9.gem (100%) Building native extensions. This could take a while... ERROR: Error installing sqlite3-ruby: ERROR: Failed …

Linux Mint 16 + Ruby + SQLite3の導入

Ruby + SQlite3の勉強をすべく、gemでsqlite3-rubyを導入しようとしてつまづきました。 $ sudo apt-get install ruby $ sudo apt-get install sqlite3 $ sudo gem install sqlite3-ruby Building native extensions. This could take a while... ERROR: Erro…

Rubyのローカル変数初期化ルール

初期化されていないローカル変数を参照すると、NameErrorが発生します。例えば、以下のコードを実行すると def method(i) p a end method(-1) ローカル変数aは初期化されていないので、NameErrorになります。 local_init_1.rb:2:in `method': undefined loca…

Rubyの真偽値

falseとnilが偽、それ以外はすべて真。

JavaとRubyの例外処理の書き方の違い

Java try { // 処理 } catch (Exception e) // 例外処理 } finally { // 後始末とか } Ruby begin # 処理 rescue => e # 例外処理 ensure # 後始末とか end

クラスメソッド(呼び出し)の書き方2通り

どちらも同じ意味。 クラス名.メソッド名 クラス名::メソッド名

Rubyの変数、定数の命名規則

種類 記法 ローカル変数 先頭がアルファベット小文字か、"_" グローバル変数 先頭が"$" インスタンス変数 先頭が"@" クラス変数 先頭が"@@" 定数 先頭がアルファベット大文字

Rubyのアクセサ

地道に書いてみる。 class Person # 参照 def name return @name end # 更新 def name=(value) @name = value end end これは、下記のように書くことができます。参照のみ class Person attr_reader :name end 更新のみ class Person attr_writer :name end …

is_a?メソッド

Rubyのinstance_of?メソッドは、自分の直接の親クラスのみをチェックします。 そこから上にはさかのぼりません。さかのぼってチェックしたいときはis_a?メソッドを使います。 s = "hello" puts s.instance_of?(String) puts s.instance_of?(Object) puts s.i…

instance_of?メソッド

Rubyのinstance_of?メソッドは、自分の直接の親クラスのみチェックします。 それより上には辿りません。(Javaのinstanceofと違うんですね) array = [] puts array.instance_of?(Array) puts array.instance_of?(Object) と実行すると、結果は true falseとな…

do~end と {~}

5.times {|i| puts i} という書き方が今ひとつ理解できず悩んでしまいました。。 書き換えると、 5.times do |i| puts i end ということなんですね。納得できました。お恥ずかしい。。

invalid byte sequence in Windows-31J (ArgumentError)

Rubyでこんなコードを書いて、 file = open(ARGV[0]) UTF-8なファイルをオープンしようとしたら invalid byte sequence in Windows-31J (ArgumentError) と怒られました。openメソッドでは、モード引数で文字コードを指定できるようです。 file = open(ARGV[…

ワンライナー

rubyコマンドに-eオプションで実行できる。 ruby -e 'puts "hello"'

Rubyの真偽値

falseとnilは偽、それ以外は真