В Ruby я должен использовать || = или, если определено? для memoization?

Я нахожусь в середине проекта, где я получаю имена таблиц и полей, используя DESCRIBE. Я бы использовал Client_x_Broker, чтобы я мог легко найти таблицу и получить поля, используя в качестве критерия _x_, строку, которая не будет происходить естественным образом в коде или наборах данных, ну, во всяком случае, в моем, и ее легко strp, чтобы найти имена отдельных таблиц. Кроме того, пока я последовательный, я могу получить много информации только из имени таблицы, включая имена первичного ключа. Извините за опоздание и б, продолжается. :)

15
задан Matt J 9 June 2009 в 01:30
поделиться

3 ответа

Будьте осторожны: x || = y присваивает x = y, если x возвращает false. Это может означать, что x undefined, nil или false.

Часто переменные будут определены и false, хотя, возможно, не в контексте переменной экземпляра @current_user_session.

Если вы хотите краткости, попробуйте условная конструкция:

defined?(@current_user_session) ?
    @current_user_session : @current_user_session = UserSession.find

или просто:

defined?(@current_user_session) || @current_user_session = UserSession.find

, если вам просто нужно инициализировать переменную.

25
ответ дан 1 December 2019 в 02:46
поделиться

В Rails есть мемоизация, посмотрите скринкаст ниже, чтобы увидеть отличное введение:

http://railscasts.com/episodes/137-memoization

class Product < ActiveRecord::Base
  extend ActiveSupport::Memoizable

  belongs_to :category

  def filesize(num = 1)
    # some expensive operation
    sleep 2
    12345789 * num
  end

  memoize :filesize
end
1
ответ дан 1 December 2019 в 02:46
поделиться

Кроме того, более удобный вариант || = выдает предупреждение (по крайней мере, в 1.8.6 и 1.8.7) о неинициализированных переменных экземпляра, в то время как более подробный вариант определяет? версию нет.

С другой стороны, это, вероятно, делает то, что вы хотите:

def initialize
  @foo = nil
end

def foo
  @foo ||= some_long_calculation_for_a_foo
end

Но почти наверняка этого не происходит:

def initialize
  @foo = nil
end

def foo
  return @foo if defined?(@foo)
  @foo = some_long_calculation_for_a_foo
end

, поскольку @foo будет всегда определен в этот момент.

0
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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