不能在顶层使用实例变量

can't use instance variables at the top level

我正在尝试让音频播放器与 Crystal 配合使用。互联网表明 portaudio 是播放音频的最佳 C 库,并且由于没有原生 Crystal 库,它似乎是最佳选择。

有人已经完成了将 portaudio API 绑定到 Crystal 的大部分工作,但该项目已过时并且似乎已被 Crystal 更新破坏.我认为修复其他人的绑定比从头开始做所有事情更容易。

这是一个不必要的长介绍。当我尝试编译 crystal-portaudio 时,出现以下错误:

$ crystal src/portaudio.cr                                                                                                                 ~/sw/crystal/crystal-portaudio (master)
Error in src/portaudio.cr:1: while requiring "./portaudio/*"

require "./portaudio/*"
^

in src/portaudio/device.cr:2: while requiring "./host_api"

require "./host_api"
^

in src/portaudio/host_api.cr:5: can't use instance variables at the top level

    delegate :device_count, :default_input_device, :default_output_device, :type, @info
                                                                                  ^~~~~

Link to offending line.

这是让 crystal speccrystal samples/list.cr 编译以及 运行 和 Crystal 0.22 的最小补丁,但是碎片似乎还需要做更多的工作真的好用。

diff --git a/spec/portaudio_spec.cr b/spec/portaudio_spec.cr
index d8171a9..049a294 100644
--- a/spec/portaudio_spec.cr
+++ b/spec/portaudio_spec.cr
@@ -1,6 +1,6 @@
 require "./spec_helper"

-describe Portaudio do
+describe Pa do
   # TODO: Write tests

   it "works" do
diff --git a/src/portaudio/device.cr b/src/portaudio/device.cr
index f5ec4f3..cf999ee 100644
--- a/src/portaudio/device.cr
+++ b/src/portaudio/device.cr
@@ -3,13 +3,13 @@ require "./host_api"

 module Pa
   class Device
-    delegate :max_input_channels, :max_output_channels, @info
-    delegate :default_low_input_latency, :default_low_output_latency, @info
-    delegate :default_high_input_latency, :default_high_output_latency, @info
-    delegate :default_sample_rate, @info
+    delegate :max_input_channels, :max_output_channels, to: @info
+    delegate :default_low_input_latency, :default_low_output_latency, to: @info
+    delegate :default_high_input_latency, :default_high_output_latency, to: @info
+    delegate :default_sample_rate, to: @info
     getter id

-    def initialize(@id, @info)
+    def initialize(@id : Pa::DeviceIndex, @info : LibPortAudio::DeviceInfo)
     end

     def name
diff --git a/src/portaudio/host_api.cr b/src/portaudio/host_api.cr
index de3b521..9a95ec2 100644
--- a/src/portaudio/host_api.cr
+++ b/src/portaudio/host_api.cr
@@ -2,9 +2,9 @@ require "./lib"

 module Pa
   class HostApi
-    delegate :device_count, :default_input_device, :default_output_device, :type, @info
+    delegate :device_count, :default_input_device, :default_output_device, :type, to: @info

-    def initialize(@info)
+    def initialize(@info : LibPortAudio::HostApiInfo)
     end

     def name