MATLAB 中的 1 行 try/catch 等价物

1-line try/catch equivalent in MATLAB

我在 MATLAB 中遇到一种情况,我想尝试将结构字段分配给新变量,如下所示:

swimming = fish.carp;

但字段 carp 可能已定义,也可能未定义。如果 carp 不是有效字段,是否可以指定默认值?例如,在 Perl 中我会写

my $swimming = $fish{carp} or my $swimming = 0; 

其中 0 是默认值,or 指定分配失败时要执行的操作。似乎 MATLAB 中应该存在类似的东西,但我似乎找不到它的任何文档。为了代码的可读性,如果可以的话,我宁愿不使用 if 语句或 try/catch 块。

据我所知,您不能在 MATLAB 中一行完成。 MATLAB 逻辑结构需要明确的 if/else 语句,不能在一行中完成……就像在 Perl 或 Python.

中一样

您可以做的是检查 fish 结构是否包含 carp 字段。如果不是,那么您可以将默认值设置为 0。

使用 isfield 来帮助您做到这一点。因此:

if isfield(fish, 'carp')
    swimming = fish.carp;
else
    swimming = 0;
end

此外,正如 Ratbert 所说,您可以用逗号将其放在一行中...但是同样,您仍然需要 if/else 结构:

if isfield(fish,'carp'), swimming = fish.carp; else, swimming = 0;

另一种可能的解决方法是自己声明一个接受结构和字段的自定义函数,并允许它 return 该字段的值,或 0。

function [out] = get_field(S, field)
    if isfield(S, field)
        out = S.(field);
    else
        out = 0;
    end

那么,你可以这样做:

swimming = get_field(fish, 'carp');

swimming 要么是 0,要么是 fish.carp。这样,它不会牺牲代码的可读性,但您需要创建一个自定义函数来执行您想要的操作。

您可以创建自己的函数来处理此问题并使代码更加清晰。类似于:

swimming = get_struct(fish, 'carp', 0);

function v = get_struct(s, f, d)

if isfield(s, f)
    v = s.(f);   % Struct value
else
    v = d;       % Default value
end

最佳,

如果您不想在单独的函数文件中定义自定义函数 - 这当然是一个不错的选择 - 您可以在函数的开头定义 两个匿名函数改为脚本。

helper = {@(s,f) 0, @(s,f) s.(f)}
getfieldOrDefault = @(s,f) helper{ isfield(s,f) + 1 }(s,f)

同定义

fish.carp = 42

函数调用

a = getfieldOrDefault(fish,'carp')
b = getfieldOrDefault(fish,'codfish')

你获得第一个

a =  42

和之前为第二种情况定义的默认值

b =  0