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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

1104閲覧

evalで実行結果を全て表示させたい

_totoro

総合スコア0

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/14 09:42

前提・実現したいこと

Railsでプログラムのコードの正誤判定システムを作っています。
evalを利用して入力したプログラムと解答のプログラムを正誤判定するシステムを作っています。
プログラムをevalで実行すると、なぜか、最後の行だけ実行結果が表示されてしまいます。
プログラミング初心者です。ヒントやアドバイス、よろしくお願い致します。

発生している問題・エラーメッセージ

例えば、
a = "abc"
b = "def"
print a
puts b
のようなコードをevalで実行しようとすると、print a の"abc"は出力されず、puts b の"def"だけが出力・表示されている状況です。
printもputsも両方を出力したいと考えています。

該当のソースコード

#kijyutu_controller.rb def date ''' def seikai @kaitou = Kijutsu.find_by(id: params[:id]) @kaitou2 = @kaitou.seikai.sub("puts","p") binding end''' #問題の解答 @kaitou = Kijutsu.find_by(id: params[:id]) @kaitou2 = @kaitou.seikai.gsub("puts","p").gsub("print","p")#.gsub("\r\n",",") @kaitou3 = eval(@kaitou2) #フォームで入力したコード @seito = Kijutsu.new(title: params[:title],mondai: params[:mondai],seikai: params[:seikai],kaisetu: params[:kaisetu],hint: params[:hint]) @seito2 = @seito.seikai.gsub("puts","p").gsub("print","p") @seito3 = eval(@seito2) #正誤判定 if @kaitou3 == @seito3 flash[:notice] = "正解" render("/kijutsus/kijutsuseikai") else render("/kijutsus/kijutsumatigai") end end

試したこと

@kaitou2 = <<"EOS"
@kaitou.seikai.gsub("puts","p").gsub("print","p")
EOS
@kaitou3 = eval(@kaitou2)
ヒアドキュメントを試しましたが、実行結果の表示は、evalがうまく動かず、コードがそのまま出力されました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ruby

1require 'stringio' 2oldio = $stdout 3newio = StringIO. new 4$stdout = newio 5 6eval "puts 'seikai'" 7 8$stdout = oldio 9puts "[[#{newio.string}]]"

ただ、evalではまともなサンドボックスを構築するのは難しいので
open3などを用いて新しくrubyコマンドをなんらかのサンドボックス上で実行し
その標準出力を取得するのがよいかと思います。

投稿2020/09/14 12:31

編集2020/09/14 12:32
asm

総合スコア15147

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

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

_totoro

2020/09/16 08:05

回答ありがとうございます。 返信が遅れてしまい申し訳ございません。 お教えいただいた、open3などを用いる方法を試してみます。 ありがとうございました。
guest

0

>> ddd=' a = "abc" b = "def" print a puts b' => "\na = \"abc\"\nb = \"def\"\nprint a\nputs b" >> eval ddd abcdef => nil

両方出るようですが。。。

投稿2020/09/14 09:57

winterboum

総合スコア23360

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

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

_totoro

2020/09/14 11:27

回答ありがとうございます。 ターミナルのirbで両方出力されているように見えると思うのですが、railsでは式の評価が出力されてしまいます。回答いただいた最後の行である、=> nilが表示されるのと同じところが出力されます。 上記の質問したソースコードで実行した結果は、@seito3: def と表示されます。 式の評価で両方出力させるにはどうすればいいのでしょうか。
winterboum

2020/09/14 12:11

出力結果は難しいかな。 puts にせよ printにせよ、出力は「副作用」で、そのmethodの戻り値は nil です。 rubyのmethodの戻り値は最後に実行された式の結果ですから、それが返ってくる。 putsなどは標準出力に書き出されるので、標準出力を切り替えてそちらに出すという高等手段が必要です。やります?
_totoro

2020/09/16 08:07

回答ありがとうございます。 返信が遅れてしまい申し訳ございません。 出力結果はやはり難しいのですね。 rails初心者のため、高等手段を利用するのは難しいと考えました。 他の方法がないか探してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問