Чистый способ присвоить значение, если не пусто - PullRequest
4 голосов
/ 04 июня 2010

Мне часто нужно назначать переменную, если установлено исходное значение. Пока я сделал это так:

filters[:red] = params[:search][:red] unless params[:search][:red].nil?

Это работает, но выглядит немного неуклюже. Должен быть более СУХОЙ способ получения этого результата.

Есть предложения?

С уважением. Асбьерн Морелл.

Ответы [ 4 ]

2 голосов
/ 04 июня 2010

Если вы обнаружите, что делаете много, вы можете написать небольшой вспомогательный метод:

def set_unless_nil(hsh, key, val)
  hsh[key] = val unless val.nil?
end

и затем:

set_unless_nil filters, :red, params[:search][:red]

И если ключ в хеше источника и назначения часто совпадает, вы можете написать:

def copy_key_unless_nil(src_hash, key, dest_hash)
  dest_hash[key] = src_hash[key] unless src_hash[key].nil?
end

, а затем:

copy_key_unless_nil params[:search], :red, filters

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

filters.delete_if { |k, v| v.nil? }
0 голосов
/ 04 июня 2010

Если params [: search] [: red] может быть только nil, потому что его нет в хэше и предполагается, что вы хотите скопировать все в params [: search] в фильтры, тогда:

filters.merge!(params[:search])
0 голосов
/ 04 июня 2010

Если params[:search][:red] может быть только нулем, потому что его нет в хэше, я бы использовал params[:search].has_key?(:red), чтобы случайный читатель мог понять, какая ситуация лучше.

0 голосов
/ 04 июня 2010

Это уже довольно хорошо, но это может быть немного сухо

red=params[:search][:red]
filters[:red]=red if red

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

unless x.nil?

как:

if x

они будут оценивать то же самое, но последнее немного более двусмысленно и чище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...