Проблема с кодом, как таковая, на самом деле не очень связана с Rust, но вы потребляете читателей, когда читаете их. Ваш код в основном делает (в псевдокоде):
file1 = open("file1");
file2 = open("file2");
for line1 in read_lines(file1):
for line2 in read_lines(file2):
compare(line1, line2)
С file1
все в порядке, так же как и с file2
при первом чтении. Но во второй итерации внешний цикл file2
находится в конце файла, поэтому из него больше не будут считываться строки, и цикл заканчивается.
Самое простое решение - читать file2
каждый раз:
file1 = open("file1");
for line1 in read_lines(file1):
file2 = open("file2");
for line2 in read_lines(file2):
compare(line1, line2)
Это не очень эффективно, потому что вы читаете один и тот же файл снова и снова.
Если вы хотите прочитать его только один раз, вы можете собрать все Records
из file2
в Vec
, а затем повторить Vec
столько раз, сколько необходимо:
Для предоставления немного отличающегося ответа..., в то время как значения безопасны с точки зрения типов с точки зрения кастинга они все еще неконтролируемы, после того как они были брошены - т.е.
enum Foo { A = 1, B = 2, C = 3 }
static void Main()
{
Foo foo = (Foo)500; // works fine
Console.WriteLine(foo); // also fine - shows 500
}
Поэтому необходимо заботиться для проверки значений - например, с a default
в a switch
это выдает исключение.
Можно также проверить (для не -[Flags]
значения) через:
bool isValid = Enum.IsDefined(typeof(Foo), foo);
Да они.
Следующее из http://www.csharp-station.com/Tutorials/Lesson17.aspx
Перечисления являются константами со строгим контролем типов. Они - чрезвычайно уникальные типы, которые позволяют Вам присваивать символьные имена интегральным значениям. В традиции C# они со строгим контролем типов, означая, что перечисление одного типа не может быть неявно присвоено перечислению другого типа даже при том, что базовое значение их участников является тем же. В том же направлении целочисленные типы и перечисления не неявно interchangable. Все присвоения между различными перечислимыми типами и целочисленными типами требуют явного броска.
Перечисления являются константами со строгим контролем типов. Они - чрезвычайно уникальные типы, которые позволяют Вам присваивать символьные имена интегральным значениям. В традиции C# они со строгим контролем типов, означая, что перечисление одного типа не может быть неявно присвоено перечислению другого типа даже при том, что базовое значение их участников является тем же. В том же направлении целочисленные типы и перечисления не неявно interchangable. Все присвоения между различными перечислимыми типами и целочисленными типами требуют явного броска.
Для тех, которые предлагают использовать Перечисление. IsDefined, чтобы сделать проверку аргумента... не делают! На Brad Abrams (от Обновления Инструкций по Дизайну Платформы на Перечислимом Дизайне):
Существует действительно две проблемы с Перечислением. IsDefined (). Сначала это загружает отражение и набор холодных метаданных типа, делающих это обманчиво дорогой вызов. Во-вторых, поскольку примечание ссылается на, здесь существует проблема управления версиями.
Да.
C#: перечислимые типы:
- Безопасное с точки зрения типов перечисление именованных значений.
- Предотвращает программные ошибки
- Пользователь может управлять базовым типом (значения по умолчанию к интервалу)
- Также может управлять базовыми значениями
Технически не, потому что можно представить Перечисление как его основное значение (интервал, долго, и т.д.). Однако, если Вы удостоверитесь, чтобы Вы только использовали перечисление его обеспеченными именами, то Вы получите ошибки времени компиляции, если Вы измените имя перечисляемого значения, не обновляя его ссылки. В этом отношении да это безопасно с точки зрения типов.
Я опаздываю стороне здесь, но я хотел вывести немного что-то дополнительное... Обновление Руководства по проектированию Платформы.NET от Krzysztof Cwalina. В дополнение к превосходной подсказке выше относительно проверки для обеспечения допустимого значения передается Перечислениям, это обеспечивает другое руководство и совет для того, как использовать их эффективно, набор глюков (особенно включенный Flags
перечисления), и т.д.
yes they r strongly-typed safed u cannot it does not do impilcit convertion of enum constant variables to integeral value u hv 2 expilcitly do dat eg enum days { sun, mon } int e = (int ) days.sun; console.writeline(e);