Movatterモバイル変換


[0]ホーム

URL:


Yukun's Blog

難しいことを簡単に分かりやすく紹介

フォローする

Ruby: lambdaメソッドを使いブロックをオブジェクト化

Ruby

に関して、練習します。
他の言語と比較してRubyのコードブロックの扱いは特徴的で扱い難そうに見えますが、使いこなせればコード量を減らせるし、その結果として可読性も増すので、慣れていきたいです。

def times_n(n)  lambda  { |x| x * n}     # Kernel#lambdaの引数はブロック# lambda do |x| x * n end  でもよい(複数行に渉るときなど)。endtimes_ten = times_n(10)    # nに10を代入# 生成されたtimes_tenはProcインスタンスp times_ten.class          #=> Proc# times_ten = { |x| x * n} はエラー。# {}でのブロックはメソッドの引数としてのみ渡せる。# また、ブロック引数はメソッドの最後の引数として定義する。# ブロックの実行にはcallメソッドを用いるp times_ten.call(5)        # ブロック変数xに10が代入される#=> 50

ここで、クラスProcとは

Proc はブロックをコンテキスト(ローカル変数のスコープやスタックフレーム)とともにオブジェクト化した手続きオブジェクトです。
Rubyリファレンスマニュアル : Proc

続けて、以下も練習してみる。

arr1 = [1, 2, 3, 4, 5]arr2 = arr1.collect(&times_ten)p arr2 #=> [10, 20, 30, 40, 50]p arr2.class #=> Array

ここで、Enumerable#collectは、

collect : 各要素を順番にブロックに渡して評価し、その結果で要素を置き換えます。
Rubyリファレンスマニュアル : collect

ブロックが格納された変数をメソッドの引数として渡すときは「&」をその変数名の前につけます。
仮につけないと以下のようなエラーが出ます。

`collect': wrong number of arguments (1 for 0) (ArgumentError)

最後に、selectメソッドを用い、同時に評価に条件を組み込んでみます。

def times_n(n)  lambda { |x| x * n}   # lambdaの引数はブロックendtimes_ten = times_n(10) # nに10を代入ceiling = 50arr3 = [1, 25, 50, 55, 30, 100]p arr3.select { |x| x < ceiling }#=> [1, 25, 30]arr4 = [0.1, 2.5, 5, 5.5, 3, 10]p arr4.collect(&amp;amp;times_ten).select { |x| x < ceiling } #  -.-;#=> [1.0, 25.0, 30]

arr3の要素が順にブロック変数xに読み込まれます。

select : 各要素に対してブロックを評価した値が真であった要素を全て含む配列を返します。真になる要素がひとつもなかった場合は空の配列を返します。 –
Rubyリファレンスマニュアル : select

関連記事

NO IMAGE

Ruby: メソッドの引数にブロックを渡す

ブロックの使い方を練習してみます。def repeat(n) n.times { yield } if block_given?e...

NO IMAGE

とあるボットのチャットログ

人工無脳とのチャットログyukun> こんにちはbot > こんちはyukun> 元気してた?bot > 元気に、そう見えても、おかし...

NO IMAGE

POSTメソッドを用いてExcite翻訳を行うRubyコード

しかし、未完です。Webの巡回などにはWWW::Mechanizeという便利なライブラリがありますが、あえてnet/httpのPOSTメソ...

NO IMAGE

チャットログから本文を抽出

先日、メッセンジャーのチャットで会話するボットを作りました。 そのボットに「学習」させるネタに、会話文であるWindows Live Mes...

NO IMAGE

Webページから指定したタグの要素を抜き出すRuby関数

単一のWebページから抜き出した複数の要素を配列に格納して返します。以下の例はaタグの要素(エレメント)を抽出した場合です。Rubyコー...

NO IMAGE

JavaとRubyで文字列の終端の扱いの違い

RubyのコードをJavaに書き直す際に注意する相違点が幾つかあったので、そのうちの一つを挙げてみます。特に文字列関係は色々やりにくいです。...

NO IMAGE

タグの中の要素を抜き出すRuby関数

ライブラリを使えば簡単ですが、正規表現の学習の為に。ソースコードdef return_between(unporsed, start,...

NO IMAGE

Rubyで引数の設定値によって4パターンの部分文字列を取得するラッパー関数

引数に設定値を与え、それによって挙動を変えることで、似た機能をまとめてみます。追記(2008.2.8):正規表現のマッチを保持する変数があ...

NO IMAGE

Rubyで文字列から日本語文字をインデックス指定する

RubyのStringインスタンスに格納されている文字列のインデックスを得るにはchrメソッドを用います。ソースコード# chrは文字...

Ruby 1.9.3インストール: yumリポジトリ追加時の依存性の欠如エラー – libyaml

ほったらかしにしていたとある自鯖のRedmineのアップグレードに際し、Ruby 1.9系のビルドに必要なlibyamlをyumでインストー...


コメントをどうぞコメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

検索


Sponsored Link

最近の投稿

カテゴリー

アーカイブ

最近のコメント


[8]ページ先頭

©2009-2025 Movatter.jp