[解決済み] Rubyでパラメータとしてメソッドを渡す
2022-06-08 02:17:59
質問
私はRubyを少しばかりいじろうとしています。そこで私は、「集合知のプログラミング」という本の中のアルゴリズム(Pythonで提供されている)をRubyで実装しようとしています。
第8章で、著者はパラメータとしてメソッドaを渡します。これはPythonでは動作するようですが、Rubyでは動作しません。
私はここでメソッド
def gaussian(dist, sigma=10.0)
foo
end
で、これを別のメソッドで呼び出したい場合
def weightedknn(data, vec1, k = 5, weightf = gaussian)
foo
weight = weightf(dist)
foo
end
エラーばかり
ArgumentError: wrong number of arguments (0 for 1)
どのように解決するのですか?
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
ただ、このようなブロック宣言ではデフォルトの引数を設定できないことに注意してください。 ですから、スプラッタを使い、プロックコード自体でデフォルトを設定する必要があります。
あるいは、このすべての範囲によりますが、代わりにメソッド名を渡す方が簡単かもしれません。
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のswitch文の書き方
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] C#でメソッドをパラメータとして渡す
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyのメソッド'to_sym'は何をするのですか?
-
[解決済み] ルビー階乗関数
-
[解決済み] Ruby Detect方式
-
[解決済み] nil から String への暗黙の変換ができないエラー
-
[解決済み] マトリックスサムネーションチャレンジ
-
[解決済み] Rubyで配列を平坦化するにはどうしたらいいですか?
-
[解決済み] Capybaraを使ったドロップダウンでのオプションの選択方法
-
[解決済み] Rubyの予期しないキーワードの終了、および予期しない入力の終了
-
[解決済み] Ruby 2.0.0p0 IRB警告。"DLは非推奨です。Fiddleをお使いください。"
-
[解決済み] Rubyでガウス(正規分布)乱数を生成するコード