質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

774閲覧

Ruby 配列の作成のルール?マナー?

kurokoSin

総合スコア133

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2019/06/21 16:10

編集2019/06/21 23:27

Rubyの勉強をしています。
配列の勉強をしている中で下記サイトのコーディングスタイルに出会いました。

fortissimo1997/ruby-style-guide

配列やハッシュを生成する時はリテラル記法を使いましょう。 (コンストラクタに引数を渡す場合を除けば、とい うことですが) [link]

# 悪い例 arr = Array.new hash = Hash.new # 良い例 arr = [] arr = Array.new(10) hash = {} hash = Hash.new(0)

これは、何故 Array.new や Hash.new が悪い例となるのでしょうか?
arr = [] や hash = {} と何が違うのかよくわかりません。

お手数をおかけしますが、解説のほどよろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurokoSin

2019/06/21 23:27

ご指摘ありがとう御座います。修正いたしました。
guest

回答3

0

arr = [] や hash = {} と何が違うのかよくわかりません。

動作に違いがないのに書き方が長くなること自体がデメリットの1つ、とも考えられます。

投稿2019/06/22 00:19

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

パフォーマンス的な理由が挙げられます。

実行されるVM命令シーケンスを出力すると

shell

1ruby -e "[]" --dump=insns 2# 0000 newarray 0 ( 1)[Li] 3 4ruby -e "Array.new" --dump=insns 5# 0000 getinlinecache 7, <is:0> ( 1)[Li] 6# 0003 getconstant :Array 7# 0005 setinlinecache <is:0> 8# 0007 opt_send_without_block <callinfo!mid:new, argc:0, ARGS_SIMPLE>, <callcache>

これだけの違いがあります。
実測したわけではありませんが、まぁ間違いなく[]の方が速度が速いでしょう。

投稿2019/06/21 22:55

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurokoSin

2019/06/22 00:17 編集

回答ありがとうございます。 処理の内容にそこまでの違いがあるのですね。 実際に計測してみましたが、私の計測方法がまずいのか、あまり差異が見られませんでした。。。 > $ time `for n in {1..1000}; do ruby -e "[]"; done` > > real 1m22.246s > user 1m14.055s > sys 0m8.166s > $ time `for n in {1..1000}; do ruby -e "Array.new"; done` > > real 1m22.236s > user 1m13.887s > sys 0m8.314s
otn

2019/06/22 02:18

↑この測定は、 rubyの起動時間がほとんどです。せめて、 time ruby -e '10_000_000.times { [] }'
kurokoSin

2019/06/22 03:24 編集

otnさん ありがとう御座います。 rubyの起動時間で隠れてしまっていたのですね。 計測しなおしましたところ無事処理時間に差異が見られました\(^o^)/ > # Array.new の計測(1.88 秒/1000万回) > $ time ruby -e '10_000_000.times { Array.new }' > > real 0m1.881s > user 0m1.863s > sys 0m0.016s # []の計測 (0.88 秒/ 1000万回 ) > $ time ruby -e '10_000_000.times { [] }' > > real 0m0.884s > user 0m0.870s > sys 0m0.011s
guest

0

Array.newの性質のせいかなーと思っています。

arr = Array.new(3, 'hogehoge')とすると、

first_str = a[0] first_str.upcase!

によって、すべての要素が大文字になってしまうという問題が発生します。
このように1つのオブジェクトに配列の値が紐付いてしまい、それを知らず使うことで思わぬバグを生みかねないため、にそうしているのかなーと思います。

投稿2019/06/21 17:03

tail12

総合スコア607

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/06/21 22:17

「コンストラクタに引数を渡す場合を除けば」なので。このページのルールとは関係ないですね。
kurokoSin

2019/06/22 00:20

私の質問の意図とは別なのはotnさんのご指摘の通りですが、 そのような問題があることも知りませんでした。 回答ありがとうございます。勉強になります。
tail12

2019/06/22 06:23

あ、本当ですね…すいません、見落としてました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問