[ruby-list:46484] "<<" の使い方

View: New views
8 Messages — Rating Filter:   Alert me  

[ruby-list:46484] "<<" の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

そえじま@勉強中 です。

ちょっと試しに Array#push を自分で考えてみたんですが、変なところで
エラーになってしまいます。

class Array_push
attr_accessor :ary
def initialize
ary = Array.new
ary = nil
end
def push data
ary << data && data # ここでエラーになってしまいます。
end
end

if __FILE__ == $0
ap = Array_push.new
ap.push("sample data")
print ap.ary
end

なにかrequire しないといけないんでしょうか?
よろしくお願いします。




[ruby-list:46485] Re: "<<" の使い方

by Ayumu Aizawa :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

はじめまして、あいざわです。

> class Array_push
> attr_accessor :ary
> def initialize
> ary = Array.new
> ary = nil
> end
> def push data
> ary << data && data # ここでエラーになってしまいます。
> end
> end
>
> if __FILE__ == $0
> ap = Array_push.new
> ap.push("sample data")
> print ap.ary
> end

dataと#の間に全角の空白があるから... というのもありますが、
aryがメソッドローカルなので期待する動作をしないのではないかと思います。

class Array_push
attr_accessor :ary
def initialize
@ary = Array.new
ary = nil
end
def push data
@ary << data && data # ここでエラーになってしまいます。
end
end

if __FILE__ == $0
ap = Array_push.new
ap.push("sample data")
print ap.ary
end


[ruby-list:46486] Re: "<<" の使い方

by ubuntu-14 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009年10月27日15:44 T.Soejima <clev@...>:

> ary << data && data # ここでエラーになってしまいます。

「どんな」エラーメッセージが出ますか?
「エラーになる」だけだと、問題解決につながりにくいと思います。

--
ubuntu@...


[ruby-list:46487] Re: "<<" の使い方

by NARUSE, Yui-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

2009/10/27 15:44, T.Soejima wrote:

> ちょっと試しに Array#push を自分で考えてみたんですが、変なところで
> エラーになってしまいます。
>
> class Array_push
>   attr_accessor :ary
>   def initialize
>     ary = Array.new
>     ary = nil
>   end
>   def push data
>     ary <<  data&&  data # ここでエラーになってしまいます。
>   end
> end

意図しているのは以下のようなコードではありませんか

 class Array_push
   attr_accessor :ary
   def initialize
     @ary = Array.new
   end

   def push data
     @ary <<  data if data
   end
 end

(1) インスタンス変数へのアクセサ ary
ローカル変数・メソッド名である ary でなく、
インスタンス変数@aryを用いる。
ary だと ary = と代入したときに変数として扱われてしまう。

(2) 演算子 &&
if を用いないと常に実行されてしまう

--
NARUSE, Yui  <naruse@...>


[ruby-list:46488] Re: "<<" の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

あいざわ 様

早速ありがとうございます。
変数は、@aryのインスタンス変数にしてみたんですが、同じエラーが
出てしまいます。

ubuntu様、
ubuntu さんは書きました:
> 「どんな」エラーメッセージが出ますか?
> 「エラーになる」だけだと、問題解決につながりにくいと思います。
>
>  
失礼しました。以下のようなメッセージが出力されます。
sample3.rb:8:in `push': undefined method `<<' for nil:NilClass
(NoMethodError)

恐縮ですが、よろしくお願いします。m(__)m




[ruby-list:46489] Re: "<<" の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

NARUSE 様

おお。なるほど。演算子の優先順位の問題ということでしょうか。
(表題の "&&" は間違いで "||" の方でした。)

NARUSE様のご指摘を元に、()で括ってやったら動いてくれました。

@ary << (data || data)
^^^^^^^^^^

ありがとうございます。m(__)m


NARUSE, Yui さんは書きました:
> (2) 演算子 &&
> if を用いないと常常に実行されてしまう
>  



[ruby-list:46493] Re: "<<" の使い方

by Shigehiro Yoshinaga :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

> NARUSE様のご指摘を元に、()で括ってやったら動いてくれました。
>
> @ary << (data || data)
>                ^^^^^^^^^^

これはただの

@ary << data

と同じですね。
ですから、data == nil の場合にも、@ary に nil が追加されることになります。
これって意図通りの動作ですか?

そえじまさんの意図は、
「data != nil の場合、@ary に data を追加する。data == nil の場合はなにもしない」
のように思います。これが正しいとすると、意図通りのコードを素直に書くと、

if not data.nil?
    @ary << data
end

となります。1行にまとめるなら、

@ary << data unless data.nil?

です。
もし、@ary == false になる可能性がないのならば (多くの場合この仮定は妥当)、
すでに NARUSE さんが示したように

@ary << data if data

が簡潔でいいと思います。

Ruby の場合、簡潔にするのに論理演算子を無理に使う必要はありません。
どうしても論理演算子を使いたいのならば、

data && @ary << data

となりますが、文字数は同じですし、分かりにくいだけのように思います。
--
吉永滋博 Shigehiro YOSHINAGA


[ruby-list:46494] Re: "<<" の使い方

by Toshiyasu Soejima :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Yoshinaga 様

ありがとうございます。
if を使わない方が処理が少し速くなるのか?という単なる想像で
やっておりました。

@ary << data if data

という書き方でも速度に大して変化がないなら、論理演算子を使う
必要はないんですが、今回は勉強のために書いたので、変な書き方
をしてしまいました。

ご教示、ありがとうございます。


Shigehiro Yoshinaga さんは書きました:
> これはただの
>
> @ary << data
>
> と同じですね。
> ですから、data == nil の場合にも、@ary に nil が追加されることになります。
>  
ん・・・そうなんですか。
dataがnilでも追加されるんじゃ、全く意味が無いということですね。
ありがとうございます。m(__)m