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

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

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

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

Q&A

1回答

1384閲覧

メソッド内で、クラス new するのは良くない?

roswell

総合スコア17

Ruby

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

2グッド

1クリップ

投稿2019/07/02 08:30

自作の下記コード(抜粋)中のメソッド
get_text_from_page_source_xml
が呼びだされる度に、
REXML::Document.new(xml).new
してしまうので、
その都度、インスタンスが作成されるのは、良くないのでは?

と思いつつも...

メッソド get_text_from_page_source_xml 内なので、
ローカル変数同様、.new された変数もローカル変数と同様に
メッソドの実行が終われば、その領域も破棄される

ので、問題ない?

という風に理解していますが、正しいでしょうか?

xml の element を抽出するには、
REXML::Document.new(xml)
xml ソースを引数にして .new しないとできないし...

のように、

自分の理解の整理がいまひとつできないので、ご教示いただけますでしょうか?

■ 自作コード(抜粋)

ruby

1require 'rexml/document' 2 3def get_text_from_page_source_xml(**resource_ids) 4 5 xml = @cbelement.page_source 6 doc = REXML::Document.new(xml) 7 8 resource_ids.each do |rid,v| 9 arid = "com.aspiro.tidal:id/" + rid.to_s # arid: actual resource id 10 xpath = "//*[@resource-id='#{arid}']" # need ' at before and end #{id} 11 12 begin 13 text = doc.elements[xpath].attributes["text"] 14 resource_ids[rid] = text 15 rescue => e 16 resource_ids[rid] = nil 17 end 18 end 19 20 return resource_ids 21end 22 23id0 = :artistName 24id1 = :mediaItemTitle 25texts = get_text_from_page_source_xml(id0 => :nil, id1 => :nil)
DrqYuto, torisan👍を押しています

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

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

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

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

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

Mugheart

2019/07/02 08:35

メソッドの中でクラス.newがダメ!となれば、 文字列、配列、ハッシュ、日付、何を生成するのも 全てダメということになってしまいますね...。
roswell

2019/07/02 09:23

ご教示いただきたいところは >呼びだされる度に、 >REXML::Document.new(xml).new >してしまうので、 >その都度、インスタンスが作成されるのは なのですが、そこは問題ないでしょうか? Nokogiri を用いれば doc = Nokogiri::XML(xml) .new しなくて書けます。 標準の REXML::Document だと、 doc = REXML::Document.new(xml) で、毎度 .new されるので気になっています。
guest

回答1

0

気にせず new して下さい。
doc = Nokogiri::XML(xml) でnewが無いようにみえますが、Nokogiri内部でnewしてくれているだけです。

Mugheart さんの言うとおり、
method内でnewし無い方がよいとなると、何もできないです

投稿2019/07/02 11:11

winterboum

総合スコア23347

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

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

roswell

2019/07/03 02:44

ご教示ありがとうございます。 > method内でnewし無い方がよいとなると、何もできないです は、理解はしているのですが... 使いまわしでよさそうなので、1回 new して、そのインスタンスを用いて と思っていましたが、引数に毎度 (xml) を渡さなければならないので、その 都度 new されるのが気になっていました。 REXML::Document.new のマニュアル https://docs.ruby-lang.org/ja/latest/method/REXML=3a=3aDocument/s/new.html みると、Singleton method になっているので、 問題なさそうだとの認識に至りました。
winterboum

2019/07/03 03:30

> みると、Singleton method になっているので、問題なさそうだとの認識に至りました。 なんだ、かなりの使い手ではないですか
roswell

2019/07/03 04:12

> なんだ、かなりの使い手ではないですか 頻繁にcallされる method で、毎度.new されるとその度に、 インスタンスが作られる。 渡す xml の内容も変化するので、 doc = REXML::Document.new(xml) を呼び出す必要があるし... と頭が整理できなかったので、質問に至りました。 アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問