Пожалуйста, помогите мне понять несогласованность преобразования имени метода J Ruby - PullRequest
1 голос
/ 04 августа 2020

Недавно я собрал небольшой проект, чтобы поиграть с J Ruby и его взаимодействием с Java. Вот Github gist .

LogicProcessor. java:

package me.artsolopov.jrp;

import javax.swing.*;
import javax.swing.table.TableModel;
import javax.swing.text.JTextComponent;

public interface LogicProcessor {
    void actionTrig(String inst, JTextComponent anno);
    void actionClose();
    void actionAddRow();
    void setTableFilter(String filter);

    TableModel getTableModel();
}

Части из logic_impl.rb:

require 'java'

java_import javax.swing.table.AbstractTableModel

class LProc
  java_import Java::MeArtsolopovJrp::LogicProcessor
  include LogicProcessor

  class TableModel < AbstractTableModel
    COLUMN_NAMES = {
      q: 'Q',
      w: 'Win',
      x: 'Cross'
    }.freeze

    def initialize(data)
      super()
      @data = data
    end

    def data=(new_data)
      @data = new_data
      fire_table_data_changed
    end

    def getColumnName(col)
      COLUMN_NAMES.values[col]
    end

    def getColumnCount
      COLUMN_NAMES.count
    end

    def getRowCount
      @data.count
    end

    def getValueAt(row, col)
      col_key = COLUMN_NAMES.keys[col]
      @data[row][col_key] || 0
    end

    def isCellEditable(_r, _c)
      true
    end

    def setValueAt(value, row, col)
      col_key = COLUMN_NAMES.keys[col]
      @data[row][col_key] = Integer(value)
    end
  end

  def initialize(frame)
    @frame = frame
    @table = [
      { q: 1, w: 2, x: 3 }, { q: 2, w: 4, x: 3 },
      { q: -1, w: 5, x: 4 }, { q: 3, w: 2, x: 1 },
      { q: -2, w: 2, x: 6 }
    ]
    @slice = @table
    @table_model = TableModel.new(@slice)
  end

  attr_reader :table_model

  def action_trig(inst, anno)
    anno.text = <<~DOC
      Inputted text: #{inst}
      data: #{@table}
    DOC
  end

  def action_close
    @frame.dispose
  end

  def action_add_row
    @table << {}
    @table_model.fire_table_rows_inserted(@table.length - 1, @table.length - 1)
  end

  def set_table_filter(filter)
    data = case filter
           when 'qpos' then @table.select { |row| row[:q].positive? }
           else @table
           end
    @table_model.data = data
  end
end

Код выше (и по сути) работает. Он создает форму, вводит мой экземпляр LProc в форму, а мой класс J Ruby реализует своего рода бизнес-логи c.

Однако, если я попытаюсь определить методы в LProc::TableModel в snake_case (например, column_name или get_column_name вместо getColumnName) я получаю ошибки, потому что я не реализовал абстрактные методы.

Почему J Ruby так себя ведет?

1 Ответ

3 голосов
/ 06 августа 2020

Простой ответ: «мы еще не сделали так, чтобы расширение класса работало таким образом». Logi c для расширения класса значительно сложнее, чем logi c для реализации интерфейса, и в результате мы не хотели вносить в него существенные изменения в течение многих лет. Первоначально он был написан до того, как мы начали распространять snake_case, и задолго до того, как мы улучшили реализацию интерфейса для поддержки методов snake_case из Ruby, реализующих их эквивалентные методы интерфейса camelCase.

Короче говоря, это не осознанное решение. . Это просто сложная подсистема, которая еще не согласована с остальной частью интеграции J Ruby Java.

...