Почему этот поразрядный shift-right, кажется, не работает?

1137 Подход кажется верным. Однако использование текущего подхода приведет к циклу перенаправления, если исходный запрос будет направлен в сторону users_onboard_path.
Чтобы избежать цикла, вам нужно будет пропустить вызов current_user_has_complete_profile_and_stripe_account before_action, когда исходный запрос направлен на действие users/onboard. Чтобы сделать это, вы можете добавить следующую строку в users_controller.rb, прямо вверху, внутри класса контроллера (при условии, что файл содержит действие onboard):

skip_before_action :current_user_has_complete_profile_and_stripe_account, only: [:onboard]

. мы бы в основном пропустили current_user_has_complete_profile_and_stripe_account действие, вызываемое до выполнения действия onboard, и, следовательно, удалили цикл.

ОБНОВЛЕНИЕ:

Я попытаюсь проиллюстрировать это с помощью созданного мной тестового приложения:
[ 1132]
Файл application_controller.rb приложения выглядит следующим образом:

class ApplicationController < ActionController::Base
  before_action :current_user_has_complete_profile_and_stripe_account

  private

  def current_user_has_complete_profile_and_stripe_account
    p "I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
    if some_condition?
      p "I'm redirecting to the onboard API"
      redirect_to onboard_users_path
    end
  end

  def some_condition?
    true
  end
end

В этом файле мы определяем обратный вызов before_action для перенаправления на входящий путь.
[тысяча сто тридцать четыре] [тысяча сто тридцать четыре] Файл users_controller.rb этого приложения выглядит следующим образом:

class UsersController < ApplicationController
  def login
    p "I'm in login"
    render json: { message: "This is a message from login action" }
  end

  def onboard
    p "I'm in onboard!"
    render json: { message: "This is a message from onboard action" }
  end
end

Когда я пытаюсь запустить API входа в систему, я сталкиваюсь с циклом перенаправления, как видно из вывода терминала:

Started GET "/users/login" for ::1 at 2019-04-10 11:16:09 +0530
Processing by UsersController#login as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)


Started GET "/users/onboard" for ::1 at 2019-04-10 11:16:09 +0530
Processing by UsersController#onboard as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
[ 1143] По сути, мы нажимаем метод before_action в вызове для входа в систему первым и пытаемся перенаправить на onboard_users_path. Однако при вызове /users/onboard в перенаправлении мы снова нажимаем на блок before_action, и он снова пытается перенаправить нас на /users/onboard, и это становится циклом.
Однако, если мы добавим skip_before_action :current_user_has_complete_profile_and_stripe_account, only: [:onboard] к нашему users_controller.rb, мы получим следующий вывод:

Started GET "/users/login" for ::1 at 2019-04-10 11:22:34 +0530
Processing by UsersController#login as */*
"I'm in the before_action call current_user_has_complete_profile_and_stripe_account"
"I'm redirecting to the onboard API"
Redirected to http://localhost:3001/users/onboard
Filter chain halted as :current_user_has_complete_profile_and_stripe_account rendered or redirected
Completed 302 Found in 3ms (ActiveRecord: 0.0ms)


Started GET "/users/onboard" for ::1 at 2019-04-10 11:22:34 +0530
Processing by UsersController#onboard as */*
"I'm in onboard!"
Completed 200 OK in 1ms (Views: 0.3ms | ActiveRecord: 0.0ms)

Как видно из журнала, вход в систему перенаправляет на борт, но здесь, before_action перенаправление пропускается, и мы получаем ответ по желанию.
Точно так же, в вашем примере также, первый вызов перенаправляет на onboard, а затем последующие вызовы также продолжают перенаправляться, потому что обратный вызов before_action работает и для действия onboard!

10
задан chaos 19 July 2009 в 01:17
поделиться

4 ответа

Это - проблема типа. При кастинге 0 к неподписанному, он будет прекрасен:

unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);

Редактирование на комментарии: или используйте неподписанную литеральную нотацию, которая намного более сжата.:)

unsigned mask = ~0u >> 1;
printf("%u\n", mask);
26
ответ дан 3 December 2019 в 13:35
поделиться

Расширение знака

То, что происходит, ~0 интервал со всем набором битов (-1). Теперь Вы сдвиг вправо 1; так как это -1, расширение знака сохраняет самый высокий набор битов, таким образом, это осталось со знаком (это не то, что Вы ожидали). Затем это преобразовывается в неподписанный как Вы, ожидают.

13
ответ дан 3 December 2019 в 13:35
поделиться

Попробуйте это:

unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);

RHS присвоения рассматривают как количество со знаком, если Вы не бросаете его, что означает, что Вы видели расширение знака без броска. (Я также изменил Ваш оператор печати для отображения числа в шестнадцатеричном числе, которое легче для меня декодировать.)

4
ответ дан 3 December 2019 в 13:35
поделиться

~0 строка.>> оператор смещает их, и в значении со знаком, он смещает в биты высшего порядка. Таким образом, можно сместить все, что Вы хотите, результат не изменится.

2
ответ дан 3 December 2019 в 13:35
поделиться
Другие вопросы по тегам:

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