Передача метода в качестве параметра в Ruby

Вы можете установить правый и левый громкость с помощью этого 2-го и 3-го параметров: SoundPool, developer.android.com

108
задан Christian Stade-Schuldt 7 February 2009 в 00:02
поделиться

4 ответа

Вы хотите объект proc:

gaussian = Proc.new do |dist, *args|
  sigma = args.first || 10.0
  ...
end

def weightedknn(data, vec1, k = 5, weightf = gaussian)
  ...
  weight = weightf.call(dist)
  ...
end

Просто примечание, что Вы не можете установить параметр по умолчанию в объявлении блока как этот. Таким образом, необходимо использовать нащельную рейку и установить значение по умолчанию в самом коде proc.

<час>

Или, в зависимости от Вашего объема всего этого, может быть легче передать в имени метода вместо этого.

def weightedknn(data, vec1, k = 5, weightf = :gaussian)
  ...
  weight = self.send(weightf)
  ...
end

В этом случае Вы просто называете метод, который определяется на объекте вместо того, чтобы передать в полном блоке кода. В зависимости от того, как Вы структурируете это, Вы, возможно, должны заменить self.send object_that_has_the_these_math_methods.send

<час>

Наконец, что не менее важно, можно подвесить блок от метода.

def weightedknn(data, vec1, k = 5)
  ...
  weight = 
    if block_given?
      yield(dist)
    else
      gaussian.call(dist)
    end
  end
  ...
end

weightedknn(foo, bar) do |dist|
  # square the dist
  dist * dist
end

, Но это кажется на симпатию большего количества допускающих повторное использование блоков кода здесь.

91
ответ дан Nathaniel Ford 5 November 2019 в 10:21
поделиться

Нормальный Ruby способ сделать это должно использовать блок.

, Таким образом, это было бы что-то как:

def weightedknn( data, vec1, k = 5 )
  foo
  weight = yield( dist )
  foo
end

И используемый как:

weightenknn( data, vec1 ) { |dist| gaussian( dist ) }

Этот шаблон используется экстенсивно в Ruby.

24
ответ дан Boris Stitnicky 5 November 2019 в 10:21
поделиться

Комментарии, относящиеся к блокам и Procs, корректны в этом, они более обычны в Ruby. Но можно передать метод, если Вы хотите. Вы звоните method, чтобы заставить метод и .call называть его:

def weightedknn( data, vec1, k = 5, weightf = method(:gaussian) )
  ...
  weight = weightf.call( dist )
  ...
end
97
ответ дан Boris Stitnicky 5 November 2019 в 10:21
поделиться

Необходимо назвать метод "вызовом" функционального объекта:

weight = weightf.call( dist )

РЕДАКТИРОВАНИЕ: как объяснено в комментариях, этот подход является неправильным. Это работало бы при использовании Procs вместо нормальных функций.

1
ответ дан Boris Stitnicky 5 November 2019 в 10:21
поделиться
Другие вопросы по тегам:

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