Мета-информация: найдены похожие сообщения, ноль для 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 переменные внутри метода являются локальными только для метода. Если бы это было не так, и я мог бы выплюнуть новую переменную из метода, тогда я мог бы легко генерировать своих пользователей, но это не так. Есть ли обходной путь для этого? Или объявление новой переменной вручную просто название игры?
объявление новой переменной вручную действительно является «названием игры», по правде говоря. Технически вы можете определить новую глобальную переменную где угодно, используя Object.const_set
, но это не очень хорошая практика. Что делать, если у вас есть пользователи с таким же именем? У вас может быть только переменная, указывающая на один из них. А что, если имя пользователя конфликтует с другой константой (например, кто-то по имени "String")? Обычно константы (переменные, начинающиеся с заглавных букв) в любом случае не определяются динамически, это как бы конфликтует с понятием «константа».
Начиная с версии Ruby 1.8.7, было невозможно динамически создавать локальные переменные; переменные экземпляра - да, локальные переменные - нет.
ForeverZer0 - Arnold должен быть экземпляром User MaxPleaner - Итак, что, если я создам другой механизм для создания имени переменной? Скажем, метод random_ID_generator, который создает рандомизированную строку букв / цифр, которая также проверяет, уникальна ли она? Разве что-то подобное не сработает? Я хотел бы узнать больше об Object.const_set, потому что это похоже на то, что я ищу. Кэри - Понятно.
Ваш вопрос немного сбивает с толку. На первый взгляд кажется, что вы ищете какой-то метод метапрограммирования для динамического создания переменных экземпляра, таких как:
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 Нет. Укажите фреймворк, который это делает. Если вы имеете в виду, что хотите создать объект User и присвоить имя позже, потому что имя является необязательным, это одно. И если вы имеете в виду, что хотите создать объект с динамическими членами, возможно, посмотрите на OpenStruct.
@Nick: большинство фреймворков с логикой CRUD используют хранилище данных (например, базу данных или файлы) для «создания». Жизненный цикл этих объектов имеет тенденцию быть эфемерным, в то время как их данные сохраняют постоянство через средство хранения и могут быть повторно созданы с помощью механизма извлечения данных (запрос, синтаксический анализ и т. д.)
Вы хотите, чтобы
Arnold
был отдельной константой, такой как класс / структура, как это показано в вашем примере? Если это так, есть несколько способов добиться этого. Должен лиArnold
быть экземпляромUser
или его собственным классом, производным отUser
?