data = '<html lang="en" class="">
<head>
<a href="https://example.com/9f40a.css" media="all" rel="stylesheet" /> link1</a>
<a href="https://example.com/4e5fb.css" media="all" rel="stylesheet" />link2</a>
<a href="https://example.com/5s5fb.css" media="all" rel="stylesheet" />link3</a>
</head>
</html>'
Вот мой пример кода HTML выше:
doc = Nokogiri::HTML(data)
doc.xpath('//@href').map(&:value)
=> [https://example.com/9f40a.css, https://example.com/4e5fb.css, https://example.com/5s5fb.css]
Любой инициализатор объекта, используемый вне конструктора, должен ссылаться на статические члены, поскольку экземпляр не был создан до запуска конструктора, а прямая инициализация переменной концептуально происходит до запуска любого конструктора. getUserName - это метод экземпляра, но содержащий его экземпляр недоступен.
Чтобы исправить это, попробуйте поместить инициализатор usernameDict внутри конструктора.
Ссылки ниже могут пролить свет на то, почему выполнение того, что вы пытаетесь сделать, может быть не таким хорошим, в частности, вторая ссылка:
Почему инициализаторы выполняются наоборот Заказать как конструкторы? Часть первая
Почему инициализаторы выполняются в обратном порядке как конструкторы? Часть вторая
getUserName - это метод экземпляра.
Измените его на статический, это может сработать.
ИЛИ
Инициализировать словарь в конструкторе.
Вы не можете этого сделать, потому что экземпляр должен быть инициализирован, прежде чем вы сможете получить доступ к свойствам его класса. Инициализаторы полей вызываются перед инициализацией класса.
Если вы хотите инициализировать поле usernameDict с возвращаемым значением GetUserName-Method, вы должны сделать это в конструкторе или сделать этот метод статическим.