Неявные возвращаемые значения в Ruby

В Oracle не существует такого понятия, как столбцы «auto_increment» или «identity», как в Oracle 11g . Однако вы можете легко смоделировать его с помощью последовательности и триггера:

Определение таблицы:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

Определение триггера:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

ОБНОВЛЕНИЕ:

IDENTITY столбец теперь доступен в Oracle 12c:

create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

или укажите начальные значения и значения приращения, также предотвращая любую вставку в столбец идентификаторов (GENERATED ALWAYS) (снова , Только Oracle 12c +)

create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

Кроме того, Oracle 12 также позволяет использовать последовательность в качестве значения по умолчанию:

CREATE SEQUENCE dept_seq START WITH 1;

CREATE TABLE departments (
  ID           NUMBER(10)    DEFAULT dept_seq.nextval NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

18
задан csamuel 30 June 2009 в 16:05
поделиться

2 ответа

Невозможно обойтись без публикации всей страницы с помощью UpdatePanels. Вместо редизайна приложения вот несколько вещей, которые я бы попробовал:

  1. Отключить состояние просмотра для всех элементов управления, которые в нем не нуждаются.
  2. Установите UpdateMode = "Conditional" для ваших пользовательских элементов управления. Это не обойдется без публикации всей страницы, но немного сократит время отрисовки. В браузере будет обновляться только содержимое определенной UpdatePanel.
  3. Убедитесь, что ваши пользовательские элементы управления имеют короткие идентификаторы. То, как веб-формы ASP.NET именуют элементы управления в HTML, эти идентификаторы довольно часто повторяются, если у вас много серверных элементов управления. То же самое касается именования заполнителей главной страницы. Однажды я сократил большую страницу до половины, переименовав пользовательские элементы управления и заполнители. Вам необходимо знать реализацию и поведение наиболее часто используемого метода, чтобы точно знать, как будет действовать ваша программа.

    #each возвращает коллекцию, в которой вы выполняли итерацию. Тем не менее, следующий код вернет значение line.scan (regexp).

    line.scan(regex).each do |matched|
      output << matched.join("|") << "\n"
    end
    

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

    class LineMatcher
      class << self
        def match(line, regex)
          line.scan(regex).map do |matched|
            matched.join("|")
          end.join("\n") # remember the final join
        end        
      end
    end
    

    Есть несколько полезных методов, которые вы можете использовать в зависимости от вашего очень конкретного случая. В этом случае вы можете использовать inject , если только количество результатов, возвращаемых сканированием , не велико (работа с массивами и их слияние более эффективно, чем работа с отдельной строкой).

    class LineMatcher
      class << self
        def match(line, regex)
          line.scan(regex).inject("") do |output, matched|
            output << matched.join("|") << "\n"
          end
        end        
      end
    end
    
23
ответ дан 30 November 2019 в 07:23
поделиться

В ruby ​​возвращаемое значение метода - это значение, возвращаемое последним оператором. Вы также можете выбрать явный возврат.

В вашем примере первый фрагмент возвращает строку output . Второй фрагмент, однако, возвращает значение, возвращаемое методом each (который теперь является последним stmt), который оказывается массивом совпадений.

irb(main):014:0> "StackOverflow Meta".scan(/[aeiou]\w/).each do |match|
irb(main):015:1* s << match
irb(main):016:1> end
=> ["ac", "er", "ow", "et"]

Обновление: Однако это все еще не объясняет вашу вывод в одной строке. Думаю это ошибка форматирования, он должен выводить каждое совпадение в отдельной строке, потому что так put печатает массив. Небольшой код может объяснить это лучше, чем я ..

irb(main):003:0> one_to_three = (1..3).to_a
=> [1, 2, 3]
irb(main):004:0> puts one_to_three
1
2
3
=> nil

Лично я считаю ваш метод с явным возвратом более читабельным (в данном случае)

14
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

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