2015-05-03 3 views
1

Я начал изучать язык программирования D (это довольно удивительно) и столкнулся с небольшой проблемой, когда я начал исследовать функции. Настройка довольно простая; это всего лишь способ выяснить сходство языка с другими, которые я использовал. Вот мой класс декларации:D Язык Статический класс Функция Неопределенный идентификатор

module TestClass; 
import std.string; 
class TestClass 
{ 
    this() 
    { 
     // Constructor code 
    } 

    public static string getData(){ 
     return "Test"; 
    } 
}; 

и вот мой главный:

module main; 

import std.stdio; 
import std.string; 
import TestClass; 

void main(string[] args) 
{ 
    writeln(TestClass.getData()); 
    stdin.readln(); 
} 

Там, кажется, проблема с вызовом статической функции в TestClass. Я получаю ошибку «неопределенного идентификатора». Вот картинка:

enter image description here

Кто-нибудь знает, что я делаю неправильно? Я попытался просмотреть документацию на веб-сайте digital mars, но, честно говоря, это немного противоречит интуиции.

+0

Какая версия D вы используете? – cfh

+0

@cfh Что бы то ни было. Я думаю, что я только нашел ответ. Это странно, и мне это действительно не нравится ... но это ошибка модуля. Чтобы заставить его работать, я должен ввести TestClass.TestClass.getData(); Я ищу обходной путь. – Krythic

ответ

5

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

Я думаю, что import оператор тянет в модуле TestClass , поэтому, когда вы вводите TestClass.getData(), компилятор считает, что вы ссылаетесь на глобальную функцию getData в модуле TestClass.

Вы можете это исправить несколькими способами:

  • Переименуйте TestClass модуль к чему-то еще. Это позволит избежать столкновения имени между модулем и классом. Как отмечает Джонатан М Дэвис в комментариях, конвенция в сообществе D предназначена для использования строчных символов для модулей, поэтому вы можете просто переименовать ее в testclass.
  • Импорт класс явно:

    import TestClass : TestClass; 
    
  • Написать TestClass.TestClass.getData() для обозначения класса внутри модуля.

Следует также отметить, что, в отличие от Java, классы не должны быть каждый в отдельном модуле в D.

+0

Могу ли я определить класс, не входя в модуль? Я знаю, что это отдельный вопрос ... – Krythic

+0

@Krythic: Конечно, это не Java. – cfh

+0

Можете ли вы добавить пример своего ответа, показывая это? – Krythic

Смежные вопросы