Issue #14111 has been updated by nobu (Nobuyoshi Nakada).


いくつか問題があるようです。

* `define_method` で定義されたメソッドで `ArgumentError` が起きるとSEGV
* `label` はメソッド名とは同じとは限らない
* 特異メソッドを持つオブジェクトをインスタンス変数にセットすると `Marshal.dump` できない

また、 `ArgumentError#to_s` は別ライブラリ(gem)で提供するということでしょうか。
「重箱の隅をつつく」ようですが、エラー発生から表示までの間にメソッドが再定義されることもないとは言えません。

とりあえず `ArgumentError#receiver` と `ArgumentError#method_name` を定義するパッチです。
https://github.com/nobu/ruby/tree/feature/14111-ArgumentError-attributes


----------------------------------------
Feature #14111: ArgumentErrorが発生した時メソッドのプロトタイプをメッセージに含む
https://bugs.ruby-lang.org/issues/14111#change-71587

* Author: esjee (SJ Stoker)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
(日本人じゃないですが、日本語を勉強してますから、日本語でレポートしてみました
日本語で会話することはまだ馴れてないから、読みつらいや見苦しいところもあると思います
そういうを指摘してくれれば幸いです)

# Abstract
ArgumentErrorが発生したときのメッセージをより有意義にするため、コールしたメソッドのプロトタイプを表示することを提案したいと思います

# Background
今ではArgumentErrorが発生するとこんな感じです

```
[1] pry(main)> cat ./spec/kerk_class.rb
class Kerk
  def foo1(a)
  end
end
[2] pry(main)> require './spec/kerk_class.rb'
=> true
[3] pry(main)> Kerk.new.foo1
ArgumentError: wrong number of arguments (0 for 1)
from /home/esjee/src/printprototype/spec/kerk_class.rb:2:in `foo1'
```

簡単なメソッドやよく使うメソッドではこれでも問題ありません
しかし、他の人のコードとか、あまり使わないメソッドだとこのメソッドのソースを読まないと分からないこともある
Rubyのメソッドだとマニュアルを参照するしかないかもしれない

# Proposal
ArgumentErrorのメッセージにコールしたメソッドのプロトタイプを含む
例えば

```
[4] pry(main)> Kerk.new.foo1
ArgumentError: wrong number of arguments (0 for 1)
Method prototype:
	def foo1(a)
from /home/esjee/src/printprototype/spec/kerk_class.rb:2:in `foo1'
```

# Implementation

https://github.com/esjee/PrintPrototype

とくにこのファイル
https://github.com/esjee/PrintPrototype/blob/master/lib/printprototype/core_ext/argument_error.rb

# Evaluation

ですけど、この実装には複数の問題があります

* 複数のラインで書かれたメソッドのプロトタイプはどうやって見つければ?
* 全ファイルを読み込んでるため、巨大なファイルだとパフォーマンスに問題があるかもしれない
* Ruby自身のメソッドではrbファイルが見つからないため、表示できない
* sentry-ravenに頼ってはいけないでしょう

# Discussion

これまで読んでいただいて、ありがとうございました
私から二つの質問があります
* これはよいfeatureだと思いますか?
* 上で挙げられた複数な問題をどうやって乗り越えられるでしょうか?

# Summary

ArgumentErrorが発生した時にもっと有意義なメッセージを表示したいと思います
私はこれをgemにしようと思いましたが、満足のできる実装にはできませんでした
小さくても、これはRubyを改良するfeatueだと信じてるです
皆さんの意見と助けを求め、これを書きました

---Files--------------------------------
add_receiver_and_method_name_to_argument_error_for_application_code.diff (4.5 KB)
add_receiver_and_method_name_to_argument_error_for_application_code_2.diff (8.51 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>