Выполнение расчета по массиву символов - PullRequest
2 голосов
/ 05 ноября 2019

Работа с массивом символов

> I18n.available_locales
[:en, :it, :fr, :de]
> I18n.locale
:en

выполнение вычисления массива

> I18n.available_locales - I18n.locale

возвращает ошибку:

TypeError (no implicit conversion of Symbol into Array)

невозможно работать с компонентомвычислить с помощью, чтобы преобразовать его в массив

> I18n.locale.to_a
NoMethodError (undefined method `to_a' for :en:Symbol)

Так, как можно выполнить вычисление, если конечное намерение равно

<% I18n.inactive_locales.each do |locale| %>
   <li><%= link_to locale.to_s, { locale: locale } %></li>
<% end %>

Ответы [ 3 ]

8 голосов
/ 05 ноября 2019

Сделайте второй операнд тоже массивом, например так:

I18n.available_locales - [I18n.locale]

Так как же выполнить вычисление, если конечное намерение равно

Я бы, вероятно, сделал это встроенным (таким образом, вы можете избежать исправления I18n)

<% I18n.available_locales.each do |locale| %>
   <% next if locale == I18n.locale %>
   <li><%= link_to locale.to_s, { locale: locale } %></li>
<% end %>
0 голосов
/ 05 ноября 2019

В таких случаях вы можете использовать Array() метод

Array(I18n.locale)
#=> [:en]

Array([I18n.locale])
#=> [:en]

Array(nil)
#=> []

I18n.available_locales - Array(I18n.locale)
#=> [:it, :fr, :de]

Ссылка: https://ruby -doc.org / core-2.6 / Array.html

0 голосов
/ 05 ноября 2019

Это потому, что оператор - нужен массив

try

2.2.10 :003 > [:a,:b,:c] - [:a]
 => [:b, :c]

В вашем случае будет что-то вроде

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