在Javascript中,是否有可能创建一个长度保证保持不变的数组?
例如,创建长度为2的数组A.随后,任何调用A.push()或A.pop()或设置A [5]的值的尝试都将失败.A.length总是2.
这是类型化数组(例如Float32Array)已经工作的方式.它们有固定的尺寸.但我想要一种在常规数组上获得相同行为的方法.
对于我的具体情况,我想创建一个固定长度的数组,其中每个条目都是一个对象.但我仍然想知道一般问题的答案.
假设我们正在谈论Int类型的元素(但问题仍然适用于任何类型)
我有一些功能需要循环一系列Ints.但我不在乎幕后这个序列是作为一个数组,或一个Set或任何其他奇特的结构实现,唯一的要求是我们可以循环它们.
Swift标准库将协议SequenceType定义为"可以使用for ... in循环迭代的类型".所以我的直觉是定义这样的协议:
protocol HasSequenceOfInts {
var seq : SequenceType<Int> { get }
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.SequenceType不是可以专用的泛型类型,它是一种协议.任何特定的SequenceType 都具有特定类型的元素,但它仅作为关联类型提供:SequenceType.Generator.Element
所以问题是:
我们如何定义需要特定类型序列的协议?
这是我尝试过的其他一些事情,以及为什么他们不对:
失败1
protocol HasSequenceOfInts {
var seq : SequenceType { get }
}
Run Code Online (Sandbox Code Playgroud)
协议'SequenceType'只能用作通用约束,因为它具有Self或相关类型要求
失败2
protocol HasSequenceOfInts {
var seq : AnySequence<Int> { get }
}
class ArrayOfInts : HasSequenceOfInts {
var seq : [Int] = [0,1,2]
}
Run Code Online (Sandbox Code Playgroud)
我认为这个可行,但是当我尝试使用数组的具体实现时,我们得到了
类型'ArrayOfInts'不符合协议'HasSequenceOfInts'
这是因为Array不是AnySequence(令我惊讶的是......我的期望是AnySequence会匹配任何Ints序列)
失败3
protocol HasSequenceOfInts {
typealias S : SequenceType
var seq : S { get }
}
Run Code Online (Sandbox Code Playgroud)
编译,但序列seq的元素没有义务类型为Int
失败4 …
我最初了解到Unix时间是自1970年1月1日00:00:00(UTC)以来经过的秒数。一天有24小时,这意味着unix时间戳每天都会增长86400。
然后我听说了闰秒的概念,并认为这意味着也许在某些日子里,unix 时间戳会在一天内增长 86401 秒,但显然情况并非如此。根据我的阅读,每天都被视为恰好包含 86400 秒。当你得到闰秒时,操作系统会以某种方式“捏造”它,以确保仍然有 86400 个时间戳 - 要么让当天的每个“秒”比真正的 SI 秒长一点,要么他们会报告连续两次相同的整数时间戳。
所以我认为这意味着自 1970 年 1 月 1 日以来的每个日期都可以映射到一个唯一的整数,即当天 00:00:00 (UTC) 的时间戳除以 86400。(保证是一个没有余数的整数,因为每天讨论的必须有 86400 个时间戳)。或者,您可以采用当天的任何时间戳并计算floor(timestamp / 86400)。
例如,今天,2021 年 4 月 23 日星期五 - UTC 时间 00:00:00 的时间戳为 1619136000。正如预期的那样,这是 86400 的倍数,并且 1619136000 / 86400 = 18740。自 Unix 纪元以来已经有 18740 天了。
所以我的问题是:
timestamp_at_midnight_utc / 86400?或者是有一些我忽略的微妙问题。我的动机是,我经常必须进行复杂的计算,涉及大量没有任何时间信息的日期(我在一家度假租赁公司工作,每个单位都有自己的可用性日历)。我认为,如果我使用唯一表示日期的整数而不是DateTime对象或字符串(如'2021-04-23'.
使用文字数据填充javascript类型数组的最佳方法是什么?
最近我一直在使用javascript类型数组进行一些数学工作.特别是,我使用了很多Float32Array对象.
我经常需要手动填充它们的值.使用常规数组,可以使用以下文字语法:var a = [0,1,2];但似乎没有相同的方法来填充类型化数组,因此我发现我必须使用大量单独的语句;
var a = new Float32Array(3);
a[0] = 0;
a[1] = 1;
a[2] = 2;
Run Code Online (Sandbox Code Playgroud)
如果超过大约4个值,这会非常烦人.而且在脚本大小和javascript执行方面似乎都很浪费,因为它必须解释所有这些单独的语句.
我用过的另一种方法是创建一个setter函数:
var populateArray(a,vals) {
var N = vals.length;
for (var i=0; i<N; i++) {a[i]=vals[i];}
};
var a = new Float32Array(3);
populateArray(a,[0,1,2]);
Run Code Online (Sandbox Code Playgroud)
但这似乎也很浪费.我必须先创建一个与输入数组一样大的常规数组,然后输入populateArray函数,然后进行迭代.
所以......问题是:是否有更直接有效的方法用文字数据填充类型数组?
我正在开发XCode中的OSX项目.我在XCode中添加了一个图像集到我的资产目录.它被称为'Foo'.
我如何从中获得CGImage?
从中获取NSImage似乎非常简单:
let image = NSImage(named: "Foo")
Run Code Online (Sandbox Code Playgroud)
......但不是我需要的CGImage.
具体设置:OSX 10.11上的XCode 7.1在Swift 2.1中的El-Capitan编码导入Cocoa和MetalKit
编辑:有些人已经指出如何通过CGImageForProposedRect方法将NSImage转换为CGImage.我希望完全避开NSImage,因为它似乎是一个浪费的中间步骤.但也许这是访问您的图像资产的唯一方法?如果有人知道避免NSImage转换的方法会很好,否则我猜接受的答案是最好的方法.
我刚刚在新的CentOS 6.5安装上安装了apache.我在浏览器地址栏中输入了ip地址,但无法连接.然后我关掉iptables,然后刷新,这次我可以连接.
所以很明显iptables阻止了http(端口80)流量.
所以我查看了iptables规则(在新的Centos安装后未触及):
[root@centos ~]# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Run Code Online (Sandbox Code Playgroud)
现在,我不是iptables专家,但我认为我理解它很好,可以解决这样一个简单的问题.但我很困惑,因为INPUT链中的第3行是这样的:
ACCEPT all -- anywhere …Run Code Online (Sandbox Code Playgroud)