rubyで遊ぼう クラスメソッド

クラス自体に特定の機能を持たせるには、クラスメソッドを作ります。クラスメソッドは、クラス名.メソッド名 のように呼び出します。
railsでは、データベースのテーブル全体を対象にするメソッドをクラスメソッドとして用意しています。

それでは、例を見てみましょう。

class Robot
	def initialize(name, x, y)
		@name = name
		@x = x; @y = y
	end
	def to_s
		"#{@name}: #{@x},#{@y}"
	end

	def self.load(fname)
		robots = []
		File.open(fname, encoding: "utf-8") do |f|
			f.each_line do |line|
				cols = line.chomp.split(/\t/)
				robots << new(cols[0], cols[1].to_i, cols[2].to_i)
			end
		end
		robots
	end
end

robots = Robot.load("test.txt")
robots.each{|robo| puts robo }

test.txt

ロボ1号	83	14
ロボ2号	5	51
ロボ3号	78	66

コマンド

C:\rails>ruby test.rb
ロボ1号: 83,14
ロボ2号: 5,51
ロボ3号: 78,66

rubyで遊ぼう アクセサメソッド

オブジェクト内のデータにアクセスする際には、メソッドを書かなければなりません。

読み出し用のメソッド attr_reader
書き込み用のメソッド attr_writer

それでは、例を見てみましょう。

class Robot
	attr_reader :name
	attr_accessor :score

	def initialize(name)
		@name = name
		@x = @y = 0
		@score = 10
	end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
robo2.score = 90
puts robo1.name, robo1.score
puts robo2.name, robo2.score
C:\rails>ruby test.rb
ロボ1号
10
ロボ2号
90

rubyで遊ぼう クラス

newメソッドを呼び出すと、インスタンス.initialize(name)が実行されます。

class Robot
	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
	end

	def to_s
		"#{@name}: #{@x},#{@y}"
	end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
puts robo1
robo2.move(10, 20)
puts robo2
C:\rails>ruby test.rb
ロボ1号: 0,0
ロボ2号: 10,20

おなじみメソッド制限です。
public:メソッドはどこからでも呼び出せる
private:同じクラス、サブクラス内のメソッドの中だけで呼び出せる

class Robot
	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
		crash if @x < -100 || @x > 100 || @y < -100 || @y > 100
	end

	def to_s
		"#{@name}: #{@x},#{@y}"
	end

	private
	def crash
		puts "ズコーン!"
	end
end

robo1 = Robot.new("ロボ1号")
puts robo1
robo1.move(20, 20)
puts robo1
robo1.move(40, 40)
puts robo1
robo1.move(50, 20)
puts robo1
robo1.crash
C:\rails>ruby test.rb
ロボ1号: 0,0
ロボ1号: 20,20
ロボ1号: 60,60
ズコーン!
ロボ1号: 110,80
test.rb:30:in `
': private method `crash' called for # (NoMethodError)

railsで遊ぼう rails active support

標準ライブラリ集が付属しているので、requireメソッドを使います。

open-uriは、http/ftp に簡単にアクセスするためのクラスです。
例えば、東京都のソースを取得したい場合は、

require "open-uri"

open("http://www.metro.tokyo.jp/") do |f|
	f.each_line {|line| puts line }
end

rubyで遊ぼう ハッシュ

hashは配列のようにオブジェクトをまとめるもので、hashクラスのインスタンスです。値を入れたり、値を取り出したりすには、キーを使います。
順番に取り出すにはeachメソッドを使い、キーと値の二つがeachメソッドのブロックパラメーターになります。

test.rb

books = {}
File.open("books.txt", encoding: "utf-8") do |f|
	f.each_line do |line|
		cols = line.chomp.split(/\t/)
		books[cols[0]] = cols[1]
	end
end

books.each do |key, val|
	puts "#{key}、#{val}円"
end

books.txt

坊ちゃん	300
こころ	380
明暗	700
C:\rails>ruby test.rb
坊ちゃん、300円
こころ、380円
明暗、700円

Rails textのインクルード

PHPのように、テキストをインクルードできます。
コントローラのアクションに記述した変数がビューに反映されて、ブラウザ上に変数値が表示されます。

/app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  	@message = "Hello, rails"
  	@txtmessage = "what's up?"
  end
end

続いてです。
/app/viws/top/index.html.erb

<h1><%= @message %></h1>
<p><%= @txtmessage %></p>

ブラウザを更新し、リクエストを送ります。
%e7%84%a1%e9%a1%8c

サーバーのWEBrickは起動したままにしましょう。

Rails, make controller and action

コントローラの作成は、まず、コマンドプロンプトで rails generate controller name action で作成します。

C:\rails\hoge>rails g controller top index

続いて、アプリケーションのconfigの下にあるroutes.rbのルーティングの設定です。
./config/routes.rb

Rails.application.routes.draw do
root 'top#index'
end

ビューも編集しましょう。
./app/views/top

<h1>こんにちわ</h1>
<p>これからです</p>

rails s でサーバーを再度起動してlocalhostのブラウザを読み込むと以下のようになっている筈です。

%e7%84%a1%e9%a1%8c

もし、画面上で以下のようなメッセージが表示された場合は、

TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。

フォルダのGemfile.lockの「coffee-script-source (1.10.0)」を「coffee-script-source (1.8.0)」に修正します。
%e7%84%a1%e9%a1%8c

そして、コマンドプロンプトで、gemをインストールします。

C:\rails\hoge>gem install coffee-script-source -v '1.8.0'

再度rails s でサーバーをアップするとエラーは消えている筈です。

railsの起動

Railsのインストールが済んだら、コマンドプロンプトからアプリケーションを作成します。

C:\Users\hoge>cd \
C:\>mkdir rails
C:\>cd rails
C:\rails>rails new sakura
C:\rails>cd sakura
C:\rails\sakura>rails server

=> Booting WEBrick
=> Rails 4.2.7.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-10-25 04:13:56] INFO WEBrick 1.3.1
[2016-10-25 04:13:56] INFO ruby 2.3.1 (2016-04-26) [x64-mingw32]
[2016-10-25 04:13:56] INFO WEBrick::HTTPServer#start: pid=7256 port=3000

http://localhost:300 もしくは http://127.0.0.1:3000/ で、下記のようにrailsの初期画面が表示されたらインストール成功です。

ruby

画面上の「About your application’s environment」をクリックすると、状態が表示されます。

WEBrickは、Rubyで書かれたウェブサーバーで、Rubyをインストールすると一緒にインストールされます。ソースコードをウェブサーバーにアップロードすることなく、1台のパソコンでRailsアプリケーションの開発と動作確認ができます。

いったん Ctl + C でWEBrickを終了したら、作成したフォルダを見てみましょう。

railsで遊ぼう

開発環境を整えます。
普段macですが、今回はwindows 10でやります。

ルビーのサイトから、最新版のルビー(現時点では2.3.1)とDevKitをインストール。
http://rubyinstaller.org/downloads/

DevKitのインストール先は、

C:\devkit

そして、DevKitのコンパイラが使えるように、コマンドプロンプトで以下を実行

C:¥Users\hogehoke>C:\devkit\devkitvars

そして、railsをインストール

C:¥Users\hogehoke>gem install rails

バージョンを確認してみましょう

C:\Users\hoge>ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]

C:\Users\hoge>rails -v
Rails 4.2.7.1

OK?

realloc()関数

割り当て済み猟奇のサイズを変更することができる。

#include 
#include 

#define BUFF_SIZE 256

int main(void)
{
    int i;
    unsigned char *pmem = NULL, *pmemsave = NULL, *pmemnew = NULL;
    
    pmemsave = pmem = (unsigned char *)malloc(BUFF_SIZE);
    if (pmem == NULL){
        fprintf(stderr, "メモリ割り当てに失敗しました。\n");
        exit(EXIT_FAILURE);
    }
    
    for (i = 0; i < BUFF_SIZE; i++)
        *pmem++ = (unsigned char)i;
    
    pmem = pmemsave;
    
    for (i = 0; i < BUFF_SIZE; i++)
        printf("%u ", *pmem++);
    printf("\n");
    
    pmemnew = realloc(pmemsave, BUFF_SIZE * 2);
    if (pmemnew != NULL){
        pmem = pmemnew;
        for (i = 0; i < BUFF_SIZE * 2; i++)
            printf("%u ", *pmem++);
        printf("\n");
        
        free(pmemnew); pmemnew = NULL;
    }
    else {
        free(pmemsave); pmemsave = NULL;
        
        fprintf(stderr, "メモリの再割り当てに失敗しました\n");
        exit(EXIT_FAILURE);
    }
    
    return 0;
}