Автоматическое создание новой переменной - Создание переменной - Ruby

Мета-информация: найдены похожие сообщения, ноль для Ruby. Создан заголовок с использованием нескольких терминов для обеспечения доступности поиска

Хорошо, теперь к вопросу ... Я пытаюсь сгенерировать новые переменные (более того) автоматически, я хотел создать механизм, который бы это делал.

class User
  attr_accessor :name

  def initialize(name)
  @name = name
  end

end

def CreateUser(name)
  name = User.new(name)
end

CreateUser("Arnold")
p Arnold

Я использовал единственный аргумент в параметре имени метода CreateUser как имя переменной, которую я хочу объявить, так и информацию, отправляемую в код, создающий член моего класса.

Я быстро вспомнил, что в Ruby переменные внутри метода являются локальными только для метода. Если бы это было не так, и я мог бы выплюнуть новую переменную из метода, тогда я мог бы легко генерировать своих пользователей, но это не так. Есть ли обходной путь для этого? Или объявление новой переменной вручную просто название игры?

Вы хотите, чтобы Arnold был отдельной константой, такой как класс / структура, как это показано в вашем примере? Если это так, есть несколько способов добиться этого. Должен ли Arnold быть экземпляром User или его собственным классом, производным от User?

ForeverZer0 08.09.2018 22:42

объявление новой переменной вручную действительно является «названием игры», по правде говоря. Технически вы можете определить новую глобальную переменную где угодно, используя Object.const_set, но это не очень хорошая практика. Что делать, если у вас есть пользователи с таким же именем? У вас может быть только переменная, указывающая на один из них. А что, если имя пользователя конфликтует с другой константой (например, кто-то по имени "String")? Обычно константы (переменные, начинающиеся с заглавных букв) в любом случае не определяются динамически, это как бы конфликтует с понятием «константа».

max pleaner 08.09.2018 23:43

Начиная с версии Ruby 1.8.7, было невозможно динамически создавать локальные переменные; переменные экземпляра - да, локальные переменные - нет.

Cary Swoveland 09.09.2018 03:04

ForeverZer0 - Arnold должен быть экземпляром User MaxPleaner - Итак, что, если я создам другой механизм для создания имени переменной? Скажем, метод random_ID_generator, который создает рандомизированную строку букв / цифр, которая также проверяет, уникальна ли она? Разве что-то подобное не сработает? Я хотел бы узнать больше об Object.const_set, потому что это похоже на то, что я ищу. Кэри - Понятно.

Nick 09.09.2018 09:23
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
4
302
1

Ответы 1

Ваш вопрос немного сбивает с толку. На первый взгляд кажется, что вы ищете какой-то метод метапрограммирования для динамического создания переменных экземпляра, таких как:

class User
  def new_variable name, value
      instance_variable_set "@#{name}", value
  end
end

Однако при более внимательном рассмотрении проблемы, которую вы на самом деле пытаетесь решить, кажется, что реальная проблема заключается в том, что вы не делаете свои методы частью исходного объекта. Вероятно, это то, что вам действительно нужно:

class User
  attr_accessor :name

  def initialize name
    @name = name
  end 

  def create_user
    # do whatever you need to do to "create" a user
    pp name
  end
end

u = User.new 'Arnold'
u.create_user

Разрешение объекту вызывать методы экземпляра для данных, хранящихся в объекте, является частью инкапсуляция. Скорее всего, это то, что вам действительно нужно.

Хм, не совсем так, вы все еще объявляете переменную, записывая u = User.new ... Этого я пытался избежать. Я в основном ищу способ генерировать переменные без их объявления. Как заводская конвейерная лента, которая может просто откачивать их, одну за другой, каждый раз, когда вызывается какой-то метод. Я знаю, что должен быть способ, потому что они делают это во фреймворке каждый раз, когда создается новый пользователь, используя функцию Create C.R.U.D., не так ли?

Nick 09.09.2018 09:26

@Nick Нет. Укажите фреймворк, который это делает. Если вы имеете в виду, что хотите создать объект User и присвоить имя позже, потому что имя является необязательным, это одно. И если вы имеете в виду, что хотите создать объект с динамическими членами, возможно, посмотрите на OpenStruct.

Todd A. Jacobs 09.09.2018 17:08

@Nick: большинство фреймворков с логикой CRUD используют хранилище данных (например, базу данных или файлы) для «создания». Жизненный цикл этих объектов имеет тенденцию быть эфемерным, в то время как их данные сохраняют постоянство через средство хранения и могут быть повторно созданы с помощью механизма извлечения данных (запрос, синтаксический анализ и т. д.)

engineersmnky 10.09.2018 23:03

Другие вопросы по теме