Извлечь текстовую строку для поля редактирования обуви из другого файла - PullRequest
0 голосов
/ 21 декабря 2018

Мое приложение работает на Shoes 3 и состоит из следующего кода

require 'somefile'

Shoes.app do
  stack do
    flow do
      @my_editbox = edit_line
    end
    flow do 
      button "Get Name" do
        @my_editbox.text = "#{@name}"
      end
    end
  end
end

С моим внешним файлом somefile.rb, содержащим

@name = "my name"

Нажатие на кнопку ничего не делает, и моя правкаполе остается пустым.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 21 декабря 2018

Это не так, как работает обувь. Shoes - это не Ruby , он выглядит только как Ruby.Многие вещи, которые вы знаете, чтобы работать в Ruby, просто не будут работать в Shoes, потому что Shoes - это инструментарий, написанный на C, который будет работать на Ruby-ish, напрямую вызывая API-интерфейсы Ruby.

require вызовыодна из вещей, которая не будет работать так, как вы ожидаете.Есть довольно запутанное объяснение некоторых из этих правил , доступных на веб-сайте Shoes .

Лично я обнаружил, что обувь настолько расстраивает и плохо документирует, что ее не стоит использовать даже вкрайне ограниченные способы его использования.Удачи.

Обновление

Вы спросили ниже о "как".Я предполагаю, что вы имеете в виду, как правильно использовать require в приложении Shoes для загрузки кода из отдельного файла.

Взгляните на в этом репо для примера.Вы можете создать обычный класс Ruby и затем require этот класс в своем приложении.Вы можете использовать этот класс в своем блоке Shoes.app do обычным способом Ruby.Но (насколько я могу судить) из-за того, как self изменяется внутри блока, вы не можете извлечь автономную переменную экземпляра, которая существует вне класса / модуля.

Вы можете сделать что-то подобноеТем не менее, и он работает так, как вы ожидаете:

# foo.rb
module Foo
  @@name = 'foobar'
end

и

# test.rb
require './foo.rb'

Shoes.app do
  stack do
    flow do
      @my_editbox = edit_line
    end
    flow do 
      button "Get Name" do
        @my_editbox.text = Foo.class_variable_get(:@@name)
      end
    end
  end
end

Здесь я создал модуль с переменной класса, потому что это не имеет смыслаиспользовать переменную экземпляра в том, что не было создано.

Конечно, есть и другие способы сделать это, и вы, вероятно, можете найти других примеров на GitHub (хотя вы можетенужно настроить этот запрос, чтобы получить больше результатов), но это функциональный пример для выполнения поставленной задачи.

...