人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyスクリプトの書きかたについて教えてください。

1| numbers = [1 ,2, 3, 4, nil, 5, nil, 7]
2| numbers.each do |number|
3| puts number unless number == nil
4| end

よく上のようなプログラムを書くのですが、
3行目のような「ある条件のときだけ表示をする」というケースで
変数が二回出てくるのがなんか気持ち悪いです。

もっとスッキリ書く方法はありますでしょうか?

「Array#compactをする」のような回答を望んでいるわけではなく、
3行目をスッキリ書くやりかたが知りたいです。

よろしくお願いします。

●質問者: kenk
●カテゴリ:コンピュータ
✍キーワード:nil Number Ruby スクリプト スッキリ
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● るびきち
●20ポイント

これが一番すっきりかつ明瞭だと思います。

numbers = [1 ,2, 3, 4, nil, 5, nil, 7]
numbers.each do |number|
 puts number if number
end
# >> 1
# >> 2
# >> 3
# >> 4
# >> 5
# >> 7

2 ● garyo
●20ポイント
numbers = [1 ,2, 3, 4, nil, 5, nil, 7]

numbers.map{|x|puts x if x}

これでどうでしょうか

あるいは先に配列から条件にあうものを消しておくとか

numbers = [1 ,2, 3, 4, nil, 5, nil, 7]
numbers.delete(nil)
numbers.each do |number|
puts number
end

3 ● くろょ
●40ポイント ベストアンサー

おっしゃりたい事は、たぶん、

  1. 与えられたパラメータを適当な条件でテストし、
  2. パスしたらそのパラメータを引き続くブロックに渡す

ような書き方はできないか?という事ですね。

組み込みの関数や制御構造にはそのようなものはないようです。

それでも、もしあえてやるとすると、自分で定義する事になると思います。

例えば、putsに特化するなら、

def putsnn(n)
 puts n if n
end

numbers = [1, 2, 3, 4, nil, 5, nil, 7]
numbers.each do |number|
 putsnn number
end

任意のブロックやメソッドに対応するなら、

def donn(n)
 yield n if n
end

numbers = [1, 2, 3, 4, nil, 5, nil, 7]
numbers.each do |number|
 donn number,&method("puts")
end

後者の場合、たまたまputsはKernelモジュールのメソッドで、奇麗な形には書けないと思うのですが、生憎、私もまだRuby初心者ですので、本当はもっといい書き方があるかもしれません。


4 ● garyo
●20ポイント

再回答ですが、これが何かすっきりした感じです。

numbers = [1 ,2, 3, 4, nil, 5, nil, 7]

puts numbers.reject{|x|x==nil}

5 ● poch-7003
●20ポイント

Rubyらしくは・・・

#こんなのダメだと怒られそうですが

numbers = [1 ,2, 3, 4, nil, 5, nil, 7]
numbers.each do |number|
 puts(number||next)
end

1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ