鉴于以下两个类
classdef EnumClass
enumeration
enumVal1
enumVal2
end
end
classdef EnumDisplay
properties
enumValue = EnumClass.enumVal1
numberValue = 1
end
end
Run Code Online (Sandbox Code Playgroud)
显示时,显示EnumClass该值:
>> E = EnumClass.enumVal1
E =
enumVal1
Run Code Online (Sandbox Code Playgroud)
但是EnumDisplay在命令窗口中显示时,枚举值被抑制,只显示数组大小和类.
>> C = EnumDisplay()
C =
EnumDisplay with properties:
enumValue: [1x1 EnumClass]
numberValue: 1
Run Code Online (Sandbox Code Playgroud)
在类属性列表中显示枚举值的最简单方法是什么.也就是说有一个简单而通用的方法让类显示如下:
>> C = EnumDisplay()
C =
EnumDisplay with properties:
enumValue: enumVal1
numberValue: 1
Run Code Online (Sandbox Code Playgroud)
我怀疑这与继承自matlab.mixin.CustomDisplay某个类的类有关,但我希望它尽可能通用,以限制我需要为每个枚举类和/或每个具有枚举的类进行编码的数量财产中的价值.
我能够找到解决这个问题的部分解决方案,但这并不是很令人满意.
classdef EnumDisplay < matlab.mixin.CustomDisplay
properties
enumValue = EnumClass.enumVal1
numberValue = 1
end
methods (Access = …Run Code Online (Sandbox Code Playgroud) 我多次遇到过这个问题,我希望最终解决这个问题.
在MATLAB中创建异构类层次结构时,会调用一个受保护的静态方法getDefaultScalarElement,它允许您定义用于创建数组的默认标量对象.如果层次结构的元素是抽象的,则可以覆盖该方法以使用其他类.
例如
classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous
methods (Static, Access = protected)
function DefaultObj = getDefaultScalarElement()
DefaultObj = ConcreteSubclass1();
end
end
end
classdef ConcreteSubclass1 < AbstractRoot
end
classdef ConcreteSubclass2 < AbstractRoot
end
Run Code Online (Sandbox Code Playgroud)
matlab中的每个具体类都有一个名为的公共静态隐藏方法empty,它创建该对象的空数组.我想为抽象类创建一个空方法,它的功能与getDefaultScalarObject方法类似.这将允许我调用AbstractRoot.empty()和接收默认类型的空数组.
例如:
classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous
methods (Static, Hidden)
function EmptyObj = empty()
EmptyObj = ConcreteSubclass1.empty();
end
end
methods (Static, Access = protected)
function DefaultObj = getDefaultScalarElement()
DefaultObj = ConcreteSubclass1();
end
end
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用(无限递归).我遇到的主要问题是我不知道如何覆盖empty,并且仍然能够从子类调用它的内置版本,因为empty …
我正在写一个zip_with带有以下签名的函数:
_A = TypeVar("_A")
_B = TypeVar("_B")
_C = TypeVar("_C")
def zip_with(zipper: Callable[[_A, _B], _C], a_vals: Iterable[_A], b_vals: Iterable[_B]) -> Generator[_C, None, None]: ...
Run Code Online (Sandbox Code Playgroud)
就像zip,但是允许您与任意函数进行聚合。对于zip_with仅允许2个参数的实现,此方法效果很好。
是否支持为可变数量的参数添加类型提示?具体来说,我想要一个任意的泛型类型列表,并且希望类型检查器能够将参数的类型与的参数进行匹配zipper。没有特定类型的方法如下:
def zip_with(zipper: Callable[..., _C], *vals: Iterable) -> Generator[_C, None, None]: ...
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望类型检查器能够将的类型*vals与的输入参数进行匹配zipper。
我是Haskell的新手,所以作为练习,我想实现一个类似于uncons返回列表中的元素init和last元素的函数.编写此函数的简便方法是
initLast :: [a] -> ([a], a)
initLast xs = (init xs, last xs)
Run Code Online (Sandbox Code Playgroud)
我是编写haskell程序的新手,但这对我来说似乎效率低下,因为它必须遍历列表两次.我提出了另一个我认为可能更好的功能,因为它不会多次遍历列表:
initLast' :: [a] -> ([a], a)
initLast' [x] = ([], x)
initLast' (x:xs) = let (xs', y) = initLast' xs
in (x:xs', y)
Run Code Online (Sandbox Code Playgroud)
但事实证明,当我在ghci中运行这些时,我发现第二个版本的速度慢了两倍,并且使用了大约3倍的内存!
ghci> :set +s
ghci> snd (initLast [1..1000000])
1000000
(0.28 secs, 122242144 bytes)
ghci> snd (initLast' [1..1000000])
1000000
(0.71 secs, 434147544 bytes)
Run Code Online (Sandbox Code Playgroud)
initLast吗?