- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,正如标题所说:与简单的 foreach 循环相比,使用 ArrayIterator 的主要好处是什么。
我有一个用作容器的对象,它的主要职责是存储一个对象数组。
有人建议我让我的类实现 IteratorAggregate 并返回一个 ArrayIterator 和我的对象数组:像这样:
public function getIterator()
{
return new ArrayIterator($this->_objs);
}
与简单地返回数组然后使用标准的 foreach 循环遍历它们相比,我看不出这样做有什么好处。
有人能解释一下为什么这是个好主意吗?
最佳答案
实现 ArrayAccess
的好处很简单:您可以访问整个对象或只是一个非常具体的,甚至是 private
属性作为数组。
在这个非常简单的示例中,我们使用 Iterator
和 ArrayAccess
来访问名为 $array
的特定属性。
class Foo implements \ArrayAccess, \Iterator
{
public $pointer = 0;
private $array = [
'first value',
'second value',
'third value',
];
public function __construct()
{
$this->pointer = 0;
}
public function current()
{
return $this->array[ $this->pointer ];
}
public function key()
{
return $this->pointer;
}
public function next()
{
++$this->pointer;
}
public function rewind()
{
$this->pointer = 0;
}
public function valid()
{
return isset( $this->array[ $this->position ] );
}
}
我们现在可以像遍历每个数组一样遍历它:
$foo = new Foo();
foreach ( $foo as $key => $value )
{
print "Index: {$key} - Value: {$value}".PHP_EOL;
}
如前例所示,我们需要实现所有这些方法来循环访问已经存在的数据。要实现 ArrayAccess
,它允许我们实际设置值,我们必须实现另一组方法:
ArrayAccess {
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}
现在我们可以通过简单地使用 IteratorAggregate
完全停止编写和重复该(当前/关键/下一个/等)方法集。这将它归纳为一个单一的强制方法:getIterator()
。
现在我们有一个像这样的结果类:
class Bar implements \ArrayAccess, \IteratorAggregate
{
private $array = [];
public function getIterator()
{
return new ArrayIterator( $this->array );
}
}
而且我们对类 $array
属性具有完整的数组访问权限。我们可以设置和取消设置值,检查它们是否返回 isset
,可以遍历它们等等。更方便。它的作用与上述所有八种方法完全相同,只是通过实现IteratorAggregate
。
最后一点:您可能会再执行一步并实现 Traversable
。这个接口(interface)非常好,因为它允许您强制实现 Iterator
或 IteratorAggregate
,而无需明确说明实现开发人员需要使用哪一个。它只是解释了对象必须是可循环的是强制性的。
$foo = new IteratorContainerController();
$foo->addDependency( Traversable $bar );
这意味着 IteratorContainerController()
的依赖项将始终是 Iterator
或 IteratorAggregate
实现的对象。因此,有人可以简单地将 IteratorAggregate
放入,或者,如果他/她需要更细粒度的控制或在设置变量之前对变量进行预处理,他/她可以简单地使用 Iterator
.
关于PHP SPL ArrayIterator v 简单 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790885/
我有一个 k*n矩阵 X 和 k*k矩阵A。对于X的每一列,我想计算标量 X[:, i].T.dot(A).dot(X[:, i]) (或者,数学上, Xi' * A * Xi )。 目前,我有一个
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是 VueJS 的新手。我已经使用 vuetify/webpack-ssr 模板创建了一个项目,现在我想创建一个登录页面,但是没有显示表单,控制台给了我以下信息: [Vue warn]: Unkno
我尝试将 value 插入到 C++ vector v 之前的第 i 元素(或元素 (i-1) 之后) )。代码很简单 v.insert(v.begin() + i, value); 我确信当 i 介
我需要显示使用合并排序算法排序的 vector 。然而,当我使用 v.begin() 时,我的 friend 使用 v.data() 来传递 vector 。他的代码运行良好,而我的却不行。请解释。
这是我的命令(url1、url2、url3、url4 是占位符): ffmpeg -i url1 -i url2 -i url3 -i url4 -filter_complex “[1:v:0] [1
我以前用过Vue,我知道怎么用v-for渲染元素序列,v-if或v-show有条件地显示元素,并且 v-model例如,控制段落的内容。 但现在我需要对 DOM 进行更精细的控制: 我有一个range
我正在学习所有权和借用。 borrow1 和borrow2 的区别在于在borrow2 打印时使用了&: fn borrow1(v: &Vec) { println!("{}", &v[10]
我找不到一种方法来选择不同的选项来渲染 v-for 中的文本。是否有可能或者我是否需要以不同的方式构建逻辑来执行类似于下面的代码的操作? // i
Iterable 的三个直接子类型是 Map , Seq , 和 Set .除了性能问题之外,似乎还有一个 Seq是从整数到值的映射,以及 Set是从值到 bool 值的映射(如果值在集合中,则为 t
我想应用一个计算方法,如果键存在则增加值,否则将 1。有 Map map = new HashMap<>(); 我不明白为什么 for (int i = 0; i v != null ? v++ :
标准(IEEE 754/C)是否保证以下代码断言永远不会失败? int main() { for ( /* all possible float / double values */ )
代码由Vue语言编写,使用Element-ui框架, 如果一个对象包含某些内容,则会显示该内容,如果不包含则禁用菜单按钮。 输出应该是这样的: a、b(禁用)、c、d、e 但我的是这样的: a、a(禁
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
我将 Vue.js 与 Vuetify 一起使用,我正在尝试使用 v-data-table 从后端加载菜单列表并使用 对其设置一些权限v-switches 但我在尝试 v-model 数组时遇到问题:
我在 Java 的流式操作中努力维护我想要的数据结构,这很可能是由于缺乏正确的理解和实践。 public class Main { public static void main(String
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
所以我想知道为什么这个 v-if 和 v-else 语句不起作用,为什么我要以不同的方式解决它。 代码如下 Required: Select a Workflow {{ isChain ?
我有一个 VueJS 组件 ,我在同一个模板中使用了两次来显示两组不同的数据。每个都显示在自己的 使用 v-if 切换的容器在导航选项卡上。 似乎这些组件被实例化为同一个实例。我调用 console
我是一名优秀的程序员,十分优秀!