итерация по каждому символу Строки в рубиновых 1.8.6 (each_char)

Я обычно нахожусь в лагере просто использования Списка непосредственно, если по некоторым причинам я не должен инкапсулировать структуру данных и обеспечить ограниченное подмножество ее функциональности. Это главным образом, потому что, если у меня нет определенной потребности в инкапсуляции, тогда делающей его, просто пустая трата времени.

Однако с агрегатом инициализирует функцию в C# 3.0, существуют некоторые новые ситуации, где я рекомендовал бы использовать настроенные классы набора.

В основном, C# 3.0 позволяет любой класс, который реализует IEnumerable и имеет Добавить метод для использования нового совокупного синтаксиса инициализатора. Например, потому что Словарь определяет метод, Добавляют (K ключ, V значений), возможно инициализировать словарь с помощью этого синтаксиса:

var d = new Dictionary<string, int>
{
    {"hello", 0},
    {"the answer to life the universe and everything is:", 42}
};

большая вещь о функции состоит в том, что она работает на, добавляют методы с любым количеством аргументов. Например, учитывая этот набор:

class c1 : IEnumerable
{
    void Add(int x1, int x2, int x3)
    {
        //...
    }

    //...
}

было бы возможно инициализировать его как так:

var x = new c1
{
    {1,2,3},
    {4,5,6}
}

Это может быть действительно полезно, если необходимо составить статические таблицы сложных объектов. Например, если бы Вы просто использовали List<Customer>, и Вы хотели создать статический список потребительских объектов, как которые что необходимо было бы создать его так:

var x = new List<Customer>
{
    new Customer("Scott Wisniewski", "555-555-5555", "Seattle", "WA"),
    new Customer("John Doe", "555-555-1234", "Los Angeles", "CA"),
    new Customer("Michael Scott", "555-555-8769", "Scranton PA"),
    new Customer("Ali G", "", "Staines", "UK")
}

Однако, если Вы используете специализированный набор, как этот:

class CustomerList  : List<Customer>
{
    public void Add(string name, string phoneNumber, string city, string stateOrCountry)
    {
        Add(new Customer(name, phoneNumber, city, stateOrCounter));
    }
}

Вы могли тогда инициализировать набор с помощью этого синтаксиса:

var customers = new CustomerList
{
    {"Scott Wisniewski", "555-555-5555", "Seattle", "WA"},
    {"John Doe", "555-555-1234", "Los Angeles", "CA"},
    {"Michael Scott", "555-555-8769", "Scranton PA"},
    {"Ali G", "", "Staines", "UK"}
}

Это имеет преимущество того, чтобы быть и легче ввести и легче читать, потому что их не потребность перепечатать имя типа элемента для каждого элемента. Преимущество может быть особенно сильным, если тип элемента длинен или сложен.

Однако это только полезно при необходимости в статических наборах данных, определенных в приложении. Некоторые типы приложений, как компиляторы, используют их все время. Другие, как типичные приложения базы данных не делают, потому что они загружают все свои данные из базы данных.

Мой совет состоял бы в том, что, если или необходимо определить статический набор объектов, или должен инкапсулировать далеко интерфейс набора, затем создать пользовательский класс набора. Иначе я просто использовал бы List<T> непосредственно.

84
задан Andrew Grimm 4 March 2011 в 02:51
поделиться

2 ответа

У меня есть та же проблема. Я обычно прибегаю к String # split :

"ABCDEFG".split("").each do |i|
  puts i
end

Думаю, вы также можете реализовать это самостоятельно следующим образом:

class String
  def each_char
    self.split("").each { |i| yield i }
  end
end

Edit: еще одна альтернатива - String # each_byte , доступен в Ruby 1.8.6, который возвращает значение ASCII каждого символа в строке ASCII:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end
111
ответ дан 24 November 2019 в 08:37
поделиться

действительно проблема в 1.8.6. и это нормально после этого выпуска

в 1.8.6, вы можете добавить это:

requre 'jcode'
1
ответ дан 24 November 2019 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: