たのしいRuby(第2版) 「はじめてのRuby」〜printメソッドを知る〜
まぁ・・・はじめてじゃないけどw
でも、まだスタートラインに立ってる感じもしないので、気分的にははじめて。
■これは「たのしいRuby 第2版」を元にしています。
Amazon CAPTCHA
Rubyを動かす
コンソール(CUI)で動かしていきます。その理由は、
・GUIは使用しているOSやツールキットなどに依存しているので、汎用のものが作りにくい
・Rubyでは、単なる文字処理の方がシンプルでわかりにくい
まぁ、ほとんどのことがテキスト処理ですので、CUIが適していると思います。
コンピュータはプログラムの集合体ですからね。
Hello,Ruby!
さて、さっそく書いみましょう。
- helloruby.rb
print("Hello, Ruby!!")
- 実行してみる
C:\enjoy_ruby>ruby helloruby.rb Hello, Ruby!!
ちゃんと、動きましたね。Rubyの世界へ入場です。
今回書いたプログラムを分析してみる
- helloruby.rb
print("Hello, Ruby!!")
たった1行ですが、さまざまな要素があります。すこし詳しく見てみましょう。
オブジェクト
"Hello, Ruby!!"
これをStringオブジェクト、または文字列オブジェクト、あるいは単に文字列と呼びます。「Hello,Ruby!!」という文字列を意味するオブジェクト、というわけです。
Rubyでは、文字列、数値、時刻などさまざまなデータがオブジェクトになります。
上記の解説通り、Rubyでは、すべてオブジェクトで表現されます。
どういうことかというと、
irb(main):001:0> "Hello,Ruby!!".class => String
"Hello,Ruby!!"のクラスがStringだと言う事がわかりますね。
メソッド
今回は、printというメソッドを使っています。
「print」は、メソッドです。メソッドとは、オブジェクトを扱うための手続きのことです。
printメソッドは、「()」の中の内容をコンソールに出力するメソッドです。ですから、helloruby.rbでは、「Hello,Ruby!!」という文字列オブジェクトが表示されています。
メソッドに渡す情報のことを引数(ひきすう)といいます。たとえば、printメソッドの機能を説明する場合には「printメソッドは引数として与えられた文字列をコンソールに出力します」といった使い方をします。
Rubyはオブジェクト指向なのに、printは関数?
それにしても、Rubyはオブジェクト指向言語のはずなのに、print()はおもいっきり関数っぽく見えますよね。
それには、わけがあります。
Ruby には厳密な意味では関数はありませんが、Kernel モジュールで 定義されているメソッドは (どこからでも関数形式で呼び出せるので) 他言語における関数のように使えます。これらのメソッドを再定義する 場合は他の場所への影響を考えて行なう必要があります。
irb(main):002:0> method(:print) => #<Method: Object(Kernel)#print>
プログラミング言語 Ruby リファレンスマニュアル
プログラミング言語 Ruby リファレンスマニュアル
組み込み関数というものです。
もっとprint
上記の例では、"Hello,Ruby!!"という文字列を第一引数として渡していますが、引数はいくつまでわたせるのでしょうか。
まず、printの仕様を見てみましょう。
print([arg1[, arg2, ...]])
引数を順に出力します。引数が与えられない時には変数 $_ の値を出力します。文字列以外のオブジェクトが引数として与えられた場合には、当該オブジェクトを to_s メソッドにより文字列に変換してから出力します。ただし、nil に対しては文字列 "nil" を出力します
変数 $, (出力フィールドセパレータ)に nil でない値がセットされている時には、各引数の間にその文字列を出力します。変数 $\ (出力レコードセパレータ)に nil でない値がセットされている時には、最後にそれを出力します。
nil を返します。
引数を順に出力します。
やってみましょう。
- helloruby.rb
print("Hello,Ruby!","Enjoy,Ruby!")
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb Hello,Ruby!Enjoy,Ruby!
ちなみに、printに引数1000個以上渡しても大丈夫です。コンピュータが許す限り大丈夫です。
文字列以外のオブジェクトが引数として与えられた場合には、 当該オブジェクトを to_s メソッドにより文字列に変換 してから出力します。
- helloruby.rb
print(1)
C:\enjoy_ruby>ruby helloruby.rb 1
あれ?文字列?みためだと分かりずらいですね・・・。でも文字列に変換されているはずです。どうやったら証明できるだろう・・。
ただし、nil に対しては文字列 "nil" を出力します
やってみましょう。
- helloruby.rb
print(nil)
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb nil
えーと・・・分かりにくいです>< windowsコンソール・・・。
「出力フィールドセパレータ」ってなに?
printの仕様に書いてある、「出力フィールドセパレータ」とはなんでしょうか。
プログラミング言語 Ruby リファレンスマニュアル
こちらに、
$\
出力レコードセパレータを表す文字列です。 print が最後にこの文字列を出力します。
デフォルトは nil で、何も出力しません。
Rubyには「コマンドラインオプション」というものがありますので、「-l」オプション「を使って「出力レコードセパレータ」を出力してみましょう。
-l
行末の自動処理を行います。まず、$\ を $/ と同じ値に設定し, printでの出力時に改行を付加するようにします。それから, -n フラグまたは-pフラグが指定されていると gets で読み込まれた各行の最後に対して String#chop!を行います。
- helloruby.rb
print("Hello,Ruby!")
- 実行結果
C:\enjoy_ruby>ruby -l helloruby.rb Hello,Ruby!
一行改行が加わりました。
ちなみに、「$\ を $/ と同じ値に設定」の「$/」はなんでしょうか。
$/ 入力レコードセパレータを表す文字列です。デフォルト値は "\n" です。
\n は、改行命令です。
nilを返します。
引数を指定しない場合、nilを返します。
- helloruby.rb
print()
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb nil
仕様通り、エラーではなく、nilが帰ってきましたね。
実行する環境
>ruby -v ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
※書籍はRuby1.8.4をベースに作ってありますが、私はインストールしてある1.8.6で行います。
RailsのFilter機能で特定のアクセスをブロック
Filter機能について気づいたこと
こちらに、RailsのFilter機能が書かれています。
くまくまーさん++
「継承時の Filter」の部分で、
Filter を評価した値(戻り値)が false である場合、その時点で Filter の適用は停止され、以降の Filter は実行されません。
アクセスできないわけですが、逆に考えるとアクセスをブロックできるということにも使えます。
例
※jpmobileが使える前提
class ApplicationController < ActionController::Base private def :pc_user request.mobile? ? false : true end def :mobile_user? request.mobile? ? true : false end end class PC_User < ApplicationController before_filter :pc_user? def list end end class Mobile_User < ApplicationController before_filter :mobile_user? def list end end
上記の例では、携帯電話 でpc_user/list へアクセスした場合、before_filter :pc_user? で false が返され、PC_Userクラスのlistメソッド は実行されないということになります。
もちろん逆も同じで、PC でmobile_user/list へアクセスした場合、before_filter :mobile_user? で false が返され、Mobile_Userクラスのlistメソッド は実行されないということになります。
これなら、Mobile_Userクラスは、携帯ユーザーに、PC_UserクラスはPCユーザーに提供できますね。
※ただ、user_agentを偽装されたら機能しませんので、ガチガチにやる必要があるならIPもチェックするなどするしかないかぁ。