Приведенный ниже код с использованием универсального кода верен, но, подумав об этом, я думаю, что использование связанного типа может быть более подходящим здесь. Черта должна выглядеть следующим образом:
pub trait HashMapContainer {
type Value;
fn get_hash_map(&self) -> &HashMap;
fn get_hash_map_mut(&mut self) -> &mut HashMap;
}
Разница в том, что теперь вы можете реализовать черту только один раз для структуры, а не несколько раз, что является более правильным в этом случае. .
Реализации примерно такие же, как с параметром универсального типа.
impl HashMapContainer for HashMapContainerImpl1 {
type Value = String;
fn get_hash_map(&self) -> &HashMap {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap {
&mut self.map
}
}
impl HashMapContainer for HashMapContainerImpl2 {
type Value = u8;
fn get_hash_map(&self) -> &HashMap {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap {
&mut self.map
}
}
( Детская площадка )
Вы также можете посмотреть на Когда уместно использовать связанный тип по сравнению с универсальным типом? , который объясняет разницу между этими двумя довольно хорошими.
Это можно решить, введя универсальный тип в вашу черту HashMapContainer
.
pub trait HashMapContainer {
fn get_hash_map(&self) -> &HashMap;
fn get_hash_map_mut(&mut self) -> &mut HashMap;
}
Я изменил подпись, чтобы вернуть ссылку на HashMap
. Было бы возможно сделать это без, например, используя clone
или принимая self
в качестве значения, а не в качестве ссылки. Я также представил _mut
версию.
Реализация является прямым предисловием:
impl HashMapContainer for HashMapContainerImpl1 {
fn get_hash_map(&self) -> &HashMap {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap {
&mut self.map
}
}
impl HashMapContainer for HashMapContainerImpl2 {
fn get_hash_map(&self) -> &HashMap {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap {
&mut self.map
}
}
Проверьте исходный код для звукового сигнала, доступного с Ubuntu (и вероятно другие дистрибутивы), или взгляните на http://www.johnath.com/beep/beep.c для другого источника (это - тот же код, я верю).
Это позволяет Вам управляющей частоте, длине и повторениям (среди прочего) легко.
позволяет имеют нас некоторый gabba, прибывающий из динамиков
#!/usr/bin/ruby
$audio = File.open("/dev/audio", "w+")
def snd char
$audio.print char.chr
end
def evil z
0.step(100, 4.0 / z) { |i|
(i / z).to_i.times { snd 0 }
(i / z).to_i.times { snd 255 }
}
end
loop {
evil 1
evil 1
evil 1
evil 4
}
более серьезно, хотя:
//g++ -o pa pa.cpp -lportaudio
#include <portaudio.h>
#include <cmath>
int callback(void*, void* outputBuffer, unsigned long framesPerBuffer, PaTimestamp, void*) {
float *out = (float*)outputBuffer;
static float phase;
for(int i = 0; i < framesPerBuffer; ++i) {
out[i] = std::sin(phase);
phase += 0.1f;
}
return 0;
}
int main() {
Pa_Initialize();
PaStream* stream;
Pa_OpenDefaultStream(&stream, 0, 1, paFloat32, 44100, 256, 1, callback, NULL);
Pa_StartStream(stream);
Pa_Sleep(4000);
}
Я не знаком с Linux, но символ ASCII вывода 0x07, кажется, делает тот прием от того, что я считал с быстрым поиском Google.
В итоге:
Вывод символа BEL на терминал может издать звуковой сигнал - в зависимости от того, какой это терминал и какова его конфигурация. Однако это не контролируется.
Любой звук, который вам нравится, может быть получен путем вывода аудиоданных в / dev / dsp или другое звуковое устройство. Это включает в себя звуковой сигнал, но для создания звука необходимо воспроизвести реальный семпл.
Драйвер консоли обеспечивает (в некоторых конфигурациях) ioctl для / dev / console, который издает звуковой сигнал с настраиваемой высотой звука (во многом аналогично NT)
Я предложил бы, чтобы Вы посмотрели на источник для утилиты звукового сигнала. это делает точно, что Вы хотите. (а именно, это открывает "/dev/console" и использует ioctl для запроса звукового сигнала. обратите внимание, что это будет только работать над приложенной консолью),