PHPerのための初めてのRuby

http://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AERuby-Yugui/dp/4873113679

Amazon.co.jp: 初めてのRuby: Yugui: 本

留意点

  • 全てがオブジェクト
.でcallbackしていく
  • 型 数字オブジェクトと文字列オブジェクトの変換
strObj = intObj.to_s
intObj = strObj.to_i
  • デバッグ var_dumpのようにしてデバッグコードを入れることはあまりありません。 以下のgemを使用して、常にデバッグ情報は画面 or エラー画面で見れます
# debug
gem 'better_errors'
gem 'binding_of_caller'
gem 'rails-footnotes'
誤差が発生するので注意する
  • シンボル 一意なObjectIDを付与して、同じ文字列の場合は同一のものを使うようにするものです。
strHogeA = :hoge
strHogeB = :hoge
strHogeA == strHogeB #=> true
strHogeA.equal? strHogeB #=> true(シンボルは同じ値なら同じobject_idになる)
大文字・小文字を区別する
  • ブロック 処理をメソッドの引数として渡せるようにしたもの
do end or { }
# ブロック付きメソッドの定義、
# その働きは与えられたブロック(手続き)に引数1, 2を渡して実行すること
def foo
  yield(1,2)
end

# fooに「2引数手続き、その働きは引数を配列に括ってpで印字する」というものを渡して実行させる
foo {|a,b|
  p [a, b]
}  # => [1, 2] (要するに p [1, 2] を実行した)

# 今度は「2引数手続き、その働きは足し算をしてpで印字する」というものを渡して実行させる
foo {|a, b|
  p a + b
}  # => 3 (要するに p 1 + 2 を実行した)

# 今度のブロック付きメソッドの働きは、
# 与えられたブロックに引数10を渡して起動し、続けざまに引数20を渡して起動し、
# さらに引数30を渡して起動すること
def bar
  yield 10
  yield 20
  yield 30
end

# barに「1引数手続き、その働きは引数に3を足してpで印字する」というものを渡して実行させる
bar {|v|
  p v + 3
}
# => 13
#    23
#    33 (同じブロックが3つのyieldで3回起動された。
#        具体的には p 10 + 3; p 20 + 3; p 30 + 3 を実行した)
  • map(&:to_s) Proc.newして、渡したオブジェクトに対してto_sを呼び出してくれます
map(&:to_s) = map { |n| n.to_s }
  • クラスの再オープン
class NilClass
  def method_missing(_method, *_args)
    # 通知
    nil
  end
end

PHPRuby(Rails含む)のメソッドの大まかな対応

PHP_INT_SIZE → メモリが許す限り
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
↓
<=>
arr.sort { |x, y| x.attr <=> y.attr }
 %Q["hello #{hoge}"]
-7 / 2 → -7.0 / 2
7 / 2 → 7.0 / 2
$str = <<<EOF EOF; → str = <<"EOF" EOF
tinyHamster → tiny_hamster
if!(cond) → unless cond
switch (cond) {case "apple": break; default: } → case "apple" cond when else end
while (cond) {} → while cond
throw new Exception('The code dont exists'); → raise 'The code dont exists'
void → 最後にnil
function hoge($a, $b, ...$c) → def hoge(a, b, *c)
namespace Search class SelectController → module Search class SelectController
if elseif else → if elsif else end
$this->_hoge → attr_accessor :a, obj.a
__construct() → initialize()
public static fuction hoge() → def self.hoge()
$this->_private → @private
$this->_protected → @@protected
global $a → $a
private function hoge
↓
class HasPrivateFunc
      private
        def hoge(a)
             p a
        end
end
p = truncate("aiueoaiueoaiueoaiueoaiueoaiueoaiueoaiueo")
aiueoaiueoaiueoaiueoaiueoai...
※デフォルトでは,30文字(1バイト,2バイト関係なく)で...(3文字)で文字丸めされます
=== → ==
.= → <<
public function hoge(&name)→ def hoge(name)
extends → <
?? → ||
$hash = [
    "mike" => 25,
    "rousey" => 21,
];
↓
hash = {
    mike: 25,
    rousey: 21
}
in_array(arr, "val"); → arr.include? "val"
$uniqArr = array_unique(); →  uniqArr = arr.uniq
array_unique(); →  array.uniq!
foreach ($arr as $val) { var_dump($val); }
↓
arr.each { |item| print item }
foreach ($arr as $idx => $val) { var_dump($val, $idx); }
↓
arr.each_with_index { |val, idx| p[val, idx] }
sort($arr); → arr.sort{|x, y| x.to_i <=> y.to_i}
array_filter ($arr) → arr.select{|item| item.flg == true}
isset($hash['test']) → hash.key? "test"
"{$item} years"→ "#{item} years"
$hash.length → hash.length or hash.size
array_keys($hash)→ hash.keys
preg_match('/^.*def$/', "abcdef") → '/^.*def$/' =~ "abcdef" or "abcdef".match('/^.*def$/')
str_replace("hoge", " ", "hoge"); → 'hoge'.sub(/hoge/, ' ')  
strpos('abc', 'a'); → 'abc'.index('a')
strpos('abc', 'a') !== false; → 'abc'.include('a')
$argv → ARGV
file_get_contents('http://www.example.com/'); → Net::HTTP.get('http://www.example.com/')
File.open("data.json", FILE::RDONLY){|f|
    contents = f.read
    print contents
}
File.open("data.json", FILE::APPEND){|f|
    f.puts 'hoge'
}
File.open("data.log"){|f|
    f.each_line do |line|
        print "#{f.lineno}: #{line}"
    end
}
array.each { |i| puts i }
array.do |i|
    next if i == 2 #=> continue
    redo if i == 3 #=> redo
    puts i
end
begin
    danger_something
rescue => error then
    puts error.message
else
    puts '例外は発生しませんでした。'
ensure
    puts '例外の発生の有無に関係なく、常に実行させる処理はこちらへ'
end

require 'open-uri'
open("http://example.com") {|connection|
    connection.each_line do |line|
        print line
    end
}