- 浏览: 243020 次
- 性别:
- 来自: ph
文章分类
最新评论
-
zrj_software:
说了等于没说,LZ能否把DLL代码给我研究下啊30729375 ...
如何在Delphi中调用.Net编写的DLL中的函数 -
reyesyang:
正在查找ruby单例模式相关资料,很有帮助,谢谢。
ruby中的单例模式 -
chaochao_pc:
您好,您的通讯工具能传输文件吗? 我在上边好像没找到!!! ...
Silverlight Socket 实现收发信息 -
huaxia524151:
谢谢,解决问题。return self.name.encode ...
Django笔记5(管理站点) -
yahon:
在flash中如何获取呢?
Flash+html--网页向FLASH传递参数
结构体类 Struct 是将许多属性 (atributes) 捆绑在一起的方便途径,可以使用存取器方法,而不必直接写一个类。 Struct 类是一个指定类集的生成器,它的每个子类都被定义为持有一组变量和它们的存取器。
也就是说, Struct.new 方法能生成 Struct 类的子类。在子类中使用 new 方法就可以生成构造体。而构造体的子类中定义了构造体成员的访问方法。
在下面这些例子中,我们将调用被创建的类
”Customer”
,然后我们显示它的一个名为
”
joe
”
的实例。此外参数
symbol
引用一个符号,它即可以是个引用字符串也可以是一个
Symbol
对象,如
:name
。
NameCard = Struct.new("NameCard", :name, :age);
puts NameCard.class
a = NameCard.new("Andrew", 10)
puts a.inspect
a.age = a.age + 1;
puts a.inspect
Struct 的超类是 Object ,它包含了模块 Enumerable 。
类方法:
(1) Struct.new( [aString] [, aSym]+> ) => StructClass 生成并返回一个名为 aString 的 Struct 类的子类,子类中定义了访问结构体成员的方法。
dog = Struct.new("Dog", :name, :age)
fred = dog.new("fred", 5)
fred.age=6
printf "name:%s age:%d", fred.name, fred.age #=>”name:fred age:6”
如果忽略名字 aString ,则将创建一个匿名 Struct 类的子类。否则,这个结构体的名字将作为 Struct 类内的一个常量名出现。因此,对于系统内的所有结构体来说它的名字必须是唯一的且以在写字母开头。 当首次要求无名类提供其类名时,它会搜索被赋值的常数名,若找到的话就以该常数名为类名 ( 请参考 Class.new ) 。
例:结构体类的类名:
p Struct.new("Foo", :foo, :bar) #=> Struct::Foo
p Foo = Struct.new(:foo, :bar) #=> Foo
aSym 可以是 Symbol 对象或字符串。此外,若 aString 为字符串话,它会被当作类名来处理,因此可以会出现错误。所以最好使用 Symbol 来指定结构体的成员。
结构体类的类方法:
(1)StructClass.new(arg, ...) => obj StructClass[arg, ...] => obj Struct::new 返回一个新的 Class 对象,随后它可被用于创建指定新结构体的实例。即生成并返回结构体对象。参数将成为结构体的初始值。实际参数的数量必须小于或等于这个类定义时的属性数量;没有指定成员初始值是,成员的值被设为 nul{} 。若传递的参数多了将引起 ArgumentError 异常。
例如:
Foo = Struct.new(:foo, :bar)
foo = Foo.new(1)
p foo.values # => [1, nil]
再如:
# 创建有名称的 Struct 类的子类 Customer 。
# => Struct::Customer
Struct.new("Customer", :name, :address)
# 创建 Customer 结构体的实例 Dave 。
#=> #Main">
Struct::Customer.new("Dave", "123 Main")
# 使用结构体的常量名创建实例。
#=> Customer
Customer = Struct.new(:name, :address)
#=> #Main">
Customer.new("Dave", "123 Main")
(2) struct.members => array 以数组的形式返回结构体成员名 ( 字符串 ) 。
例如 :
Foo = Struct.new(:foo, :bar)
p Foo.members
# => ["foo", "bar"]
Customer = Struct.new( "Customer", :name, :address, :zip )
Customer.members #-> ["name", "address", "zip"]
实例方法:
(1) struct[symbol] => anObject struct[fixnum] => anObject 属性引用 – 返回名为 symbol 实例变量的值,或者由 fixnum 编写的索引 (0..length-1) 。也就是说,是返回结构体的第 nth(0..length-1) 个成员的值。若 symbol 不是 nth 而是字符串或 Symbol 对象的话,将返回同名成员的值。若指定了并不存在的成员变量,会引发 NameError 或当索引超出范围时引发 IndexError 异常。
例如:
Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joe["name"] #=> "Joe Smith" joe[:name] #=> "Joe Smith" joe[0] #=> "Joe Smith" 再如: Foo = Struct.new(:foo, :bar) obj = Foo.new('FOO', 'BAR') p obj[:foo] # => "FOO" p obj['bar'] # => "BAR" # p obj[:baz] # => in `[]': no member 'baz' in struct (NameError) p obj[0] # => "FOO" p obj[1] # => "BAR" p obj[-1] # => "BAR" # 与 Array 一样,可以使用负的索引值。 p obj[2] # => in `[]': offset 2 too large for struct(size:2) (IndexError)
(2) struct[symbol] = obj => obj struct[fixnum] = obj => obj 属性赋值 – 对 symbol 指向的成员变量或 fixnum 索引的值赋 obj 值并返回它。即是,将结构体的第 nth 个成员的值设置为 obj ,并返回 obj 的值。若不是 fixnum 而是字符串或 Symbol 对象时,就将同名成员的值设为 obj 。若指定了并不存在的成员变量,会引发 NameError 或当索引超出范围时引发 IndexError 异常。
例如:
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe["name"] = "Luke"
joe[:zip] = "90210"
joe.name #=> "Luke"
joe.zip #=> "90210"
(3) struct.each {|obj| block } => struct 为每个实例变量调用一次 block 块,并做为参数传递这个值。即,依次对结构体的各个成员进行迭代操作。返回 self 。
例如:
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.each {|x| puts(x) }
produces: Joe Smith
123 Maple, Anytown NC
12345
(4) struct.each_pair {|sym, obj| block } => struct 为每个实例变量调用一次 block 块,传递名字 (Symbol 对象 ) 和值做为参数。即,在结构体中,依次将某成员的名称 (Symbol) 和值传递给 block 块进行迭代。返回 self 。
例如:
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.each_pair {|name, value| puts("#{name} => #{value}") }
produces: name => Joe Smith
address => 123 Maple, Anytown NC
zip => 12345
再如:
Foo = Struct.new(:foo, :bar)
Foo.new('FOO', 'BAR').each_pair {|m, v| p [m,v]}
# => [:foo, "FOO"]
[:bar, "BAR"]
(5) struct.length => fixnum struct.size => fixnum 返回结构体的成员数量。
例如:
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.length #=> 3
(6) struct.members => array 以数组形式返回结构体的成员名 ( 字符串 ) 。
例如:
Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joe.members #=> ["name", "address", "zip"]
(7) struct.to_a => array struct.values => array 将结构体的成员的值存入数组,并返回它。
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.to_a[1]
#=> "123 Maple, Anytown NC"
(8 ) struct.values_at(selector,... ) => an_array 以数组形式返回参数( 数值、字符串或Symbol 对象) 所指成员的值。selector 即可以是整数也可以是Range 对象。
例如:
a = %w{ a b c d e f } a.values_at(1, 3, 5) a.values_at(1, 3, 5, 7) a.values_at(-1, -3, -5, -7) a.values_at(1..3, 2...5)
发表评论
-
ruby 连接操作 sql2005
2010-05-24 09:38 1087The following is improved versi ... -
使用Ruby DBI模块
2009-08-18 12:29 1513使用Ruby DBI模块 ... -
Symbol对象
2009-08-07 10:19 769Symbol 对象用于表现 Ruby 解释器内的名字或 ... -
ruby中的单例模式
2009-08-05 16:00 1586Singleton 模块实现了单态模式 (Singleto ... -
ruby中的观察者模式
2009-08-05 15:56 959require 'observer' class TV ... -
区别Ruby的require,load,和include
2009-08-05 15:49 937三者之间区别并不像你想的那么难,也不会像有些文章写的那么长。挺 ... -
Object and Reflection
2009-08-05 15:34 721摘自: http://anw.stikipad.com/oc ... -
Blocks, Closures and Proc Objects
2009-08-05 15:18 752Ruby 的 block 是個不錯的設計. 一個 block ... -
Enumerable模块
2009-08-05 14:59 806可枚举模块。 Enumerable mixin 是含有几 ... -
Comparable模块
2009-08-05 12:20 1025Comparable mixin 由希望对它的对象进行排序的 ... -
Proc过程对象
2009-08-05 12:04 876就是所谓的过程对象。 Proc 对象是将一组局部变量绑定到 ... -
Method对象
2009-08-05 11:36 955Method 对象是由 Object#method(: ... -
Range对象
2009-08-04 16:29 931Range 对象表现为一个间隔,有开始与结束的值集。 Ra ... -
Ruby学习笔记
2009-08-04 16:27 12561、$variable 代表全局变量, @variable ... -
ruby惯用法
2009-08-04 15:27 843Ruby有不少惯用法,这里略作一些介绍,也方便阅读他人代码: ... -
Ruby哈希表
2009-08-04 14:51 2129哈希表的建立: ... -
Ruby中的数组过滤
2009-08-04 12:19 1078数组可以算是计算机编程中用到的最多的一个数据结构了,ruby中 ... -
Ruby数组操作总结
2009-08-04 11:50 3579数组的创建 arr = Array.new num #创 ...
相关推荐
这可能包括定义struct的声明,实例化struct对象,以及如何在函数之间传递和使用这些对象。 总的来说,struct1.2登录程序展示了struct在实际应用中的强大能力,尤其是处理结构化数据和简化代码组织。通过对struct的...
这种方式的优点在于,我们可以在不改变struct定义的情况下,创建具有可变大小数组的struct对象。然而,需要注意的是,这种做法虽然灵活,但也增加了代码的复杂性,因为它涉及到手动内存管理,可能会引发内存泄漏或...
- **数据输入**:用户输入学生、教师或课程信息,程序将其存储在相应的struct对象中。 - **数据查询**:根据学号、姓名等条件查询学生或教师信息,展示相关信息。 - **成绩管理**:添加、修改、删除学生的单科成绩,...
当你将一个struct对象作为参数传递给函数或者赋值给另一个struct变量时,会进行值拷贝。这意味着如果在函数内部改变了struct的成员,原对象不会受到影响。例如: ```cpp struct MyStruct { int x; double y; }; ...
在面向对象编程中,`struct` 和 `class` 是两个非常重要的概念,它们都是用于定义数据类型的方式,但它们之间存在一些关键区别。本篇文章将深入探讨C++中的`struct`,并解释如何在面向对象编程中有效地使用它。 ...
声明变量时可以使用任何一个,但是需要注意的是,在C++中,如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。 此外,我们还讨论了typedef struct和struct的区别,例如: ```c typedef struct ...
然而,在C++中,如果去掉`typedef`,`aaa`、`bbb`和`ccc`将被视为三个独立的对象,而不是类型别名。 4. `struct`与`typedef struct`的详细解析: 在C/C++中,`struct`后面跟的标识符(如`tagMyStruct`)称为标签,...
3. **指针与struct**:C语言中,struct指针可以用来传递和修改struct对象。通过指针,我们可以直接操作struct的成员,这对于处理大对象或需要高效访问的情况特别有用。同时,指针可以用于实现动态内存管理,如堆上...
MapStruct是一种高效的对象映射框架,它通过注解处理器自动生成类型安全、高性能且无依赖的JavaBean映射代码。在Java开发中,JavaBean之间的转换通常是一个繁琐的任务,尤其是在大型项目中,大量的转换代码不仅影响...
在 C++ 语言中也是如此,但是我们需要注意,如果我们写掉了 typedef 关键字,那么 aaa、bbb、ccc 将是截然不同的三个对象。 最后,让我们来探讨 typedef struct 和 struct 的区别。typedef struct tagMyStruct { ...
MapStruct是一个开源库,专为Java开发者设计,用于简化对象之间的映射过程。它通过代码生成的方式,极大地提高了在Spring框架中进行对象复制的效率,相比传统的`Spring BeanUtils`或者`ModelMapper`等工具,Map...
原因是,我们已经将 hello 定义为一个对象实例,而不是一个结构类型的别名。因此,我们不能使用 hello 来定义新的变量。 struct 和 typedef struct 是两个常用的数据类型定义方式,它们之间有着微妙的区别。struct ...
4. **序列化与反序列化**: JavaStruct可能提供了将结构体对象序列化为字节数组,以及从字节数组反序列化回结构体的功能,这对于网络通信或存储数据到磁盘非常有用。 5. **兼容性与效率**: 由于JavaStruct库是为了...
JavaStruct 是一个库,它允许Java开发者以类似C语言结构体(C-style structs)的方式处理Java对象。这个库特别适用于与嵌入式设备和其他使用C风格结构体的应用进行网络协议交互的情况。通过JavaStruct,程序员可以...
2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的...
MapStruct是一款优秀的代码生成工具,专门用于简化对象到对象之间的映射转换。它通过自动化的编译时处理,极大地减少了手动编写映射代码的工作量,尤其在处理复杂对象转换时,能够显著提升开发效率和代码质量。在本...
MapStruct是一款非常流行的Java注释处理器,主要用于简化Java对象(也称为Java Bean)之间的映射操作。它通过在编译时自动生成源对象到目标对象的映射代码,提高了开发效率并减少了手动编写映射代码时可能出现的错误...
x2struct的这一部分功能涉及到解析JSON对象,识别键值对,并将它们转换为struct的实例。这可能涉及到JSON解析库(如nlohmann/json或jsoncpp)的使用,以及理解如何将JSON对象映射到C++的struct。 在压缩包中,...