Структурируйте неопределенные локальные переменные. Где определить? - PullRequest
1 голос
/ 13 февраля 2020
Twitchuserspoints = Struct.new(:name, :points)
xuser = ""

unless ($pointsstructarray.include? xuser.name)
    xuser = Twitchuserspoints.new(@@username, 100)
    $pointsstructarray << xuser.name
    $pointsstructarray << xuser.points

else
    $pointsstructarray[$pointsstructarray.index(xuser.points)+1] += 1

end  

Где определить метод 'name'? Также метод '+' в другом не определен?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Предварительные сведения

Без намного большего контекста трудно понять, что вы действительно пытаетесь сделать или почему вы пытаетесь определить свое поведение в Структуре. Это не значит, что это неправильно; просто не совсем очевидно почему вы хотите сделать это таким образом.

Наследовать от Struct

Тем не менее, код для наследования от Struct довольно прост. В вашем случае вы можете сделать что-то простое:

# Define a class that inherits from the Struct class.
class TwitchUser < Struct.new(:name, :points)
end

# Assign the struct to a variable.
twitcher = TwitchUser.new 'foo', 100

# Access the struct members.
twitcher.name   #=> "foo"    
twitcher.points #=> 100

Затем вы можете отредактировать значения, назначив непосредственно члену Struct:

twicher.points = 200

Повторное открытие Класс для добавления служебных методов

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

class TwitchUser
  def inc
    self.points += 1
  end
end

twitcher.inc    #=> 101
twitcher.points #=> 101

Подход «все в одном»

Очень Ruby способ сделать это - объявить класс для наследования от Struct и включить любые служебные методы, которые вы используете. может захотеть оперировать членами. Например:

class TwitchUser < Struct.new(:name, :points)
  def inc
    self.points += 1
  end
end

Создание массива объектов Struct

Если у вас есть правильный тип объекта для представления вашей проблемной области (независимо от того, является ли она Struct), вы можете создать их массив. Например:

twitch_users = [twitcher]
twitch_users.first.name
#=> "foo"

twitch_users << TwitchUser.new('bar', 200)
twitch_users.last.name
#=> "bar"

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

twitch_users.select { |s| s.name.eql?('foo') }.first.points
#=> 101
1 голос
/ 13 февраля 2020

Struct.new(:name, :points) объявляет саму структуру. Чтобы создать его экземпляр, можно либо присвоить приведенный выше результат переменной (или константе, как вы делаете), а затем вызвать Struct#new метод для нее.

Twitchuserspoints = Struct.new(:name, :points)
x = Twitchuserspoints.new(nil, 0) # arguments are optional

# or, if you don’t want to reuse it
# x = Struct.new(:name, :points).new

x.name = "seasonalz"
x
#⇒ #<struct Twitchuserspoints name="seasonalz", points=0>

Sidenote: использование глобальных переменных класса и считается плохой практикой и анти-шаблон в большинстве современных языков, включая .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...