那么初始化记录的首选方式是什么?
具有'工厂功能':
TMyRecord = record
valueX: integer;
valueY: integer;
end;
function MyRecord(const AValueX, AValueY: integer): TMyRecord;
begin
result.valueX := AValueX;
result.valueY := AValueY;
end;
var
myrec: TMyRecord;
begin
myrec := MyRecord(1, 2);
end;
Run Code Online (Sandbox Code Playgroud)
或构造函数:
TMyRecord = record
valueX: integer;
valueY: integer;
constructor Create(const AValueX, AValueY: integer);
end;
constructor TMyRecord.Create(const AValueX, AValueY: integer);
begin
self.valueX := AValueX;
self.valueY := AValueY;
end;
var
myrec: TMyRecord;
begin
myrec := TMyRecord.Create(1, 2);
end;
Run Code Online (Sandbox Code Playgroud)
我觉得构造函数更加封装,但是在阅读代码时很容易让人感到困惑.它使它看起来像一个没有免费电话的类.打字也更多......
为什么你喜欢一个而不是另一个?
我试图在Android上获得麦克风的振幅水平,如下所示:
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);
private class RecorderTask extends TimerTask {
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder) {
this.recorder = recorder;
}
public void run() {
Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude());
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只会一直返回0.
看来为了实现这一点,我必须真正开始录制.那是对的吗?
如果是这样,我是否需要录制500ms,获得振幅,停止录制并重复?
最后,我是否必须录制到文件?我不需要保存这个音频文件,我不能只是获取当前幅度或自上次调用当前直播麦克风输入以来没有录音的最高幅度?
任何帮助表示赞赏,谢谢.
简而言之,Java 17 中的最终类和记录有什么区别?
什么情况下应该使用记录?
假设我有一个"类似函数"的记录,至少在某种意义上它表示可以应用于某些参数的操作.
通过实现clojure.lang.IFn,我可以使它作为一个函数工作,如:
(defrecord Func [f x]
clojure.lang.IFn
(invoke [this arg]
(f x arg))
(applyTo [this args]
(apply f x args)))
((->Func + 7) 1)
=> 8
Run Code Online (Sandbox Code Playgroud)
(是的,我知道我刚刚重新实现了partial...... 的劣质版本......这只是一个例子:-))
制作唱片clojure.lang.IFn的好习惯吗?
这种方法有任何陷阱吗?
我被教导结构应该几乎总是不可变的,因此记录类与记录结构的这种不寻常行为让我措手不及。
使用记录类...
record class Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Not allowed!
Run Code Online (Sandbox Code Playgroud)
使用记录结构...
record struct Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Fine!
Run Code Online (Sandbox Code Playgroud)
使用只读记录结构...
readonly record struct Person(string FirstName, string LastName);
Person p = new("John", "Smith");
p.FirstName = "Jack" // Now allowed!
Run Code Online (Sandbox Code Playgroud)
为什么非readonly记录结构默认是可变的,为什么相同的行为不适用于记录类?
编辑:我想我在这里问的是,为什么语法......很奇怪?
例如,看起来更合乎逻辑:
record class-具有值语义的可变引用类型。readonly record class-具有值语义的不可变引用类型。record struct-具有值语义的可变值类型。readonly record struct …我是Haskell的新手.我注意到Haskell不支持记录名称重载:
-- Records.hs
data Employee = Employee
{ firstName :: String
, lastName :: String
, ssn :: String
} deriving (Show, Eq)
data Manager = Manager
{ firstName :: String
, lastName :: String
, ssn :: String
, subordinates :: [Employee]
} deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
当我编译这个时,我得到:
[1 of 1] Compiling Main ( Records.hs, Records.o )
Records.hs:10:5:
Multiple declarations of `firstName'
Declared at: Records.hs:4:5
Records.hs:10:5
Records.hs:11:5:
Multiple declarations of `lastName'
Declared at: Records.hs:5:5
Records.hs:11:5
Records.hs:12:5:
Multiple declarations of `ssn' …Run Code Online (Sandbox Code Playgroud) 我正在构建一个Android应用程序,具有通过麦克风捕获声音并通过耳机播放的功能.为此,我使用了"AudioRecord"和"AudioTrack".以下是我正在使用的代码的一部分(仅用于理解)
mInBufferSize = AudioRecord.getMinBufferSize(mSampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat);
mOutBufferSize = AudioTrack.getMinBufferSize(mSampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat);
mAudioInput = new AudioRecord(MediaRecorder.AudioSource.MIC,
mSampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat,
mInBufferSize);
mAudioOutput = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat,
mOutBufferSize, AudioTrack.MODE_STREAM);
Run Code Online (Sandbox Code Playgroud)
但主要的问题是我想以mp3格式录制传入的声音?请帮助我,我真的很感激......
提前致谢
使用意图时如何限制录制?我试过这段代码:
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra("android.intent.extra.durationLimit",5);
startActivityForResult(intent,RQS_RECORDING);
Run Code Online (Sandbox Code Playgroud)
当我录制视频时,这部分代码工作正常.时间从5倒数到0,5秒后录音自动停止.但是当我录制声音时,这个有限的时间不起作用.为什么?
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
intent.putExtra("android.intent.extra.durationLimit", 5);
startActivityForResult(intent, RQS_RECORDING);
Run Code Online (Sandbox Code Playgroud)
当我录制声音时,为什么这个时间限制5秒不起作用?
我正在尝试使用模式匹配来编写计算器应用程序.
两种主要类型定义如下:
type key = Plus | Minus | Multi | Div | Equals | Digit of int;;
type state = {
lcd: int; (* last computation done *)
lka: key; (* last key actived *)
loa: key; (* last operation actived *)
vpr: int (* value print on the screen *)
};;
let print_state s =
match s with
state (a,_,_,d) -> print_int a; //Here has the compile error
print_newline();
print_int d;
print_newline();;
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个像这样的州:
let initial_state = { lcd=0; …Run Code Online (Sandbox Code Playgroud) 假设您有一个序列化器/反序列化器类型类
class SerDes a where
ser :: a -> ByteString
des :: ByteString -> a
Run Code Online (Sandbox Code Playgroud)
事实证明,对于每种类型都有一个特殊的辅助函数是至关重要的a,例如
compress :: ByteString -> ByteString -- actually varies with the original type
Run Code Online (Sandbox Code Playgroud)
我认为compress作为一个功能,我想每个关联a这是一个SerDes。(“associate”这个词可能是一个糟糕的选择,这也是互联网搜索一无所获的原因。)
该示例并不像看起来那样做作,例如何时decompress是串行器/解串器的可选功能。(是的,可以通过增加ser控制压缩的开关来避免使用助手
ser:: a -> Bool -> ByteString,或者更好地使用Config记录。但让我们坚持这个例子。)
一种方法是一个“虚拟”类,一个单例:
data For a = For
Run Code Online (Sandbox Code Playgroud)
然后这将起作用:
class SerDes a where
ser :: a -> ByteString
des :: ByteString -> a
compress :: For a -> ByteString -> ByteString …Run Code Online (Sandbox Code Playgroud)