Есть ли способ получить хороший вывод `# inspect` для объектов Java в JRuby? - PullRequest
0 голосов
/ 27 апреля 2018

Скажем, у нас есть довольно простой Java-бин:

public class Test {
    private String thing;

    public void setThing(String thing) {
        this.thing = thing;
    }

    public String getThing() {
        return thing;
    }

    @Override
    public String toString() {
        return "Test{thing=" + thing + "}>";
    }
}

И затем мы используем этот бин из Ruby:

java_import 'Test'

t = Test.new
t.thing = 'blah'
p t

Вывод:

#<Java::Default::Test:0x5fdba6f9>

Но я думаю, что я бы предпочел что-то вроде

#<Test{thing=blah}>

Или, может быть, даже просто

Test{thing=blah}

Я знаю, что мог бы добавить метод под названием inspect() ко всем моим классам Java, но, похоже, каждая реализация просто все равно будет вызывать toString(), потому что намерение toString() в Java обычно является так же, как и намерение #inspect в Ruby (т. е. строка, предназначенная только для просмотра разработчиками).

Так что мне интересно, есть ли простой способ указать JRuby использовать toString(), когда #inspect вызывается для любого объекта Java?

1 Ответ

0 голосов
/ 27 апреля 2018

Ну, в любой другой реализации ruby ​​мы просто исправим метод Object#inspect, но это невозможно для классов Java, потому что их реализация является нативной. Но вы могли бы сделать что-то подобное, чтобы сделать вашу жизнь проще:

module JavaInspect
  alias_method :inspect_without_to_string, :inspect
  def inspect_with_string
    self.respond_to?(:toString) ? self.toString : self.inspect_without_to_string
  end
  alias_method :inspect, :inspect_with_string
end

java_import 'Test'
Test.include(JavaInspect)
t = Test.new
t.inspect => "Test{thing=null}>"
t.inspect_without_to_string => "#<Java::Default::Test:0x4efac082>"

Вы просто должны включить свой модуль в нужные вам классы. Если вы действительно увлечены этим, вы можете даже создать оболочку вокруг java_import.

Пожалуйста, обратите внимание, что я не рекомендую устанавливать обезьяны для исправления Object или создавать какие-либо обертки, подобные этой, для производственного кода, однако при разработке это может быть очень полезно, а в некоторых случаях после тщательного рассмотрения оно может даже использоваться в производство.

...