Вы можете установить правый и левый громкость с помощью этого 2-го и 3-го параметров: SoundPool, developer.android.com
Вы хотите объект 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
, Но это кажется на симпатию большего количества допускающих повторное использование блоков кода здесь.
Нормальный Ruby способ сделать это должно использовать блок.
, Таким образом, это было бы что-то как:
def weightedknn( data, vec1, k = 5 )
foo
weight = yield( dist )
foo
end
И используемый как:
weightenknn( data, vec1 ) { |dist| gaussian( dist ) }
Этот шаблон используется экстенсивно в Ruby.
Комментарии, относящиеся к блокам и Procs, корректны в этом, они более обычны в Ruby. Но можно передать метод, если Вы хотите. Вы звоните method
, чтобы заставить метод и .call
называть его:
def weightedknn( data, vec1, k = 5, weightf = method(:gaussian) )
...
weight = weightf.call( dist )
...
end
Необходимо назвать метод "вызовом" функционального объекта:
weight = weightf.call( dist )
РЕДАКТИРОВАНИЕ: как объяснено в комментариях, этот подход является неправильным. Это работало бы при использовании Procs вместо нормальных функций.