Как мне найти длинный список атрибутов и сопоставить его со значком fontawesome?

private переменные не инициализируются, то есть они начинаются со случайных значений, как любая другая локальная автоматическая переменная (и они часто реализуются с использованием автоматических переменных в стеке каждого потока). Возьмите эту простую программу в качестве примера:

#include <stdio.h>
#include <omp.h>

int main (void)
{
    int i = 10;

    #pragma omp parallel private(i)
    {
        printf("thread %d: i = %d\n", omp_get_thread_num(), i);
        i = 1000 + omp_get_thread_num();
    }

    printf("i = %d\n", i);

    return 0;
}

С четырьмя потоками она выводит что-то вроде:

thread 0: i = 0
thread 3: i = 32717
thread 1: i = 32717
thread 2: i = 1
i = 10

(another run of the same program)

thread 2: i = 1
thread 1: i = 1
thread 0: i = 0
thread 3: i = 32657
i = 10

Это наглядно демонстрирует, что значение i является случайным (не инициализируется) внутри параллельной области и что любые изменения в ней не видны после параллельной области (т. е. переменная сохраняет свое значение до входа в область).

Если i сделано firstprivate то он инициализируется значением, которое оно имеет перед параллельной областью:

thread 2: i = 10
thread 0: i = 10
thread 3: i = 10
thread 1: i = 10
i = 10

После него не видны изменения значения i внутри параллельной области.

Вы уже знаете о lastprivate (и он не применим к простой демонстрационной программе, поскольку он не имеет конструкций для совместной работы).

Итак, да, firstprivate и lastprivate являются только особыми случаями private. Первый результат приводит к тому, что значения из внешнего контекста приводятся в параллельный регион, а второй переносит значения из параллельной области во внешний контекст. Обоснованием этих классов совместного использования данных является то, что внутри параллельной области все частные переменные затеняют их из внешнего контекста, т. Е. Невозможно использовать операцию присваивания для изменения внешнего значения i изнутри параллельной области.

0
задан marcamillion 17 January 2019 в 08:39
поделиться

2 ответа

Я бы, наверное, сделал что-то вроде этого, я определил чистый класс Ruby, чтобы показать, но вы можете настроить для Rails.

class PropertyFeatureOption
  attr_reader :name

  ICON_MAP  = { "fa fa-car" => ["Car Port"], "fa fa-bullhorn" => ["Panic Button", "Security Guard",  "Electronic Security"] }.freeze

  def initialize(name)
    @name = name
  end

  def icon
    icon = ICON_MAP.select { |k, v| v.include? name }.keys.first || "fa fa-whathever"
    icon.to_s
  end

end

property_feature_option = PropertyFeatureOption.new("Panic Button")
property_feature_option.icon #=> "fa fa-bullhorn"

property_feature_option = PropertyFeatureOption.new("Not in list")
property_feature_option.icon #=> "fa fa-whathever"
0
ответ дан iGian 17 January 2019 в 08:39
поделиться

Один из вариантов - то, что говорит @iGian, поместите их в хеш. Чтобы сохранить вещи в порядке, вы должны поместить их в отдельное пространство имен:

module FeatureIconizer
  module_function

  ICONS = {
    'Car Port' => 'fa-car',
    'Panic Button' => 'fa-bullhorn',
    'Security Guard' => 'fa-bullhorn',
    ...
  }

  DEFAULT = 'fa-house'

  def icon_class(feature)
    'fa ' + ICONS.fetch(feature.name, DEFAULT)
  end
end

Другой вариант, так как вы определили свои функции в БД, это также добавить значок в БД. Таким образом, вам не нужно развертывание, чтобы изменить один значок.

0
ответ дан rewritten 17 January 2019 в 08:39
поделиться
Другие вопросы по тегам:

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