`
qzriso
  • 浏览: 242372 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Struct对象

F# 
阅读更多

结构体类 Struct 是将许多属性 (atributes) 捆绑在一起的方便途径,可以使用存取器方法,而不必直接写一个类。 Struct 类是一个指定类集的生成器,它的每个子类都被定义为持有一组变量和它们的存取器。

 

也就是说, Struct.new 方法能生成 Struct 类的子类。在子类中使用 new 方法就可以生成构造体。而构造体的子类中定义了构造体成员的访问方法。

 

在下面这些例子中,我们将调用被创建的类 ”Customer” ,然后我们显示它的一个名为 joe 的实例。此外参数 symbol 引用一个符号,它即可以是个引用字符串也可以是一个 Symbol 对象,如 :name

有時候只是想要把一些資料封裝在一起, 但用到 class 實在是不太需要, 可以考慮換用 Struct 方法.
  1. Struct.new([Name,] member …), 會產生一個 “Name” 的 class
    
    NameCard = Struct.new("NameCard", :name, :age);
    puts NameCard.class
    
    
    
    
  2. 使用之前產生的 “Name” class, 你可以 new, 然後存取或寫入.
    
    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)

分享到:
评论

相关推荐

    struct1.2登录程序

    这可能包括定义struct的声明,实例化struct对象,以及如何在函数之间传递和使用这些对象。 总的来说,struct1.2登录程序展示了struct在实际应用中的强大能力,尤其是处理结构化数据和简化代码组织。通过对struct的...

    C++使struct对象拥有可变大小的数组(详解)

    这种方式的优点在于,我们可以在不改变struct定义的情况下,创建具有可变大小数组的struct对象。然而,需要注意的是,这种做法虽然灵活,但也增加了代码的复杂性,因为它涉及到手动内存管理,可能会引发内存泄漏或...

    利用struct架构编写学生、教师系统

    - **数据输入**:用户输入学生、教师或课程信息,程序将其存储在相应的struct对象中。 - **数据查询**:根据学号、姓名等条件查询学生或教师信息,展示相关信息。 - **成绩管理**:添加、修改、删除学生的单科成绩,...

    2.1.3 C++和C#数据传递 -struct类型传递

    当你将一个struct对象作为参数传递给函数或者赋值给另一个struct变量时,会进行值拷贝。这意味着如果在函数内部改变了struct的成员,原对象不会受到影响。例如: ```cpp struct MyStruct { int x; double y; }; ...

    c++面向对象基础二(struct详解)

    在面向对象编程中,`struct` 和 `class` 是两个非常重要的概念,它们都是用于定义数据类型的方式,但它们之间存在一些关键区别。本篇文章将深入探讨C++中的`struct`,并解释如何在面向对象编程中有效地使用它。 ...

    struct和typedef struct区别

    声明变量时可以使用任何一个,但是需要注意的是,在C++中,如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。 此外,我们还讨论了typedef struct和struct的区别,例如: ```c typedef struct ...

    structtype&def_struct

    然而,在C++中,如果去掉`typedef`,`aaa`、`bbb`和`ccc`将被视为三个独立的对象,而不是类型别名。 4. `struct`与`typedef struct`的详细解析: 在C/C++中,`struct`后面跟的标识符(如`tagMyStruct`)称为标签,...

    嵌入式C精华

    3. **指针与struct**:C语言中,struct指针可以用来传递和修改struct对象。通过指针,我们可以直接操作struct的成员,这对于处理大对象或需要高效访问的情况特别有用。同时,指针可以用于实现动态内存管理,如堆上...

    优雅的对象转换解决方案,为什么更推荐MapStruct呢.docx

    MapStruct是一种高效的对象映射框架,它通过注解处理器自动生成类型安全、高性能且无依赖的JavaBean映射代码。在Java开发中,JavaBean之间的转换通常是一个繁琐的任务,尤其是在大型项目中,大量的转换代码不仅影响...

    c++笔记struct和typedef struct彻底明白了

    在 C++ 语言中也是如此,但是我们需要注意,如果我们写掉了 typedef 关键字,那么 aaa、bbb、ccc 将是截然不同的三个对象。 最后,让我们来探讨 typedef struct 和 struct 的区别。typedef struct tagMyStruct { ...

    mapstruct.zip

    MapStruct是一个开源库,专为Java开发者设计,用于简化对象之间的映射过程。它通过代码生成的方式,极大地提高了在Spring框架中进行对象复制的效率,相比传统的`Spring BeanUtils`或者`ModelMapper`等工具,Map...

    C_C++中typedef_struct和struct的用法

    原因是,我们已经将 hello 定义为一个对象实例,而不是一个结构类型的别名。因此,我们不能使用 hello 来定义新的变量。 struct 和 typedef struct 是两个常用的数据类型定义方式,它们之间有着微妙的区别。struct ...

    JavaStruct.jar

    4. **序列化与反序列化**: JavaStruct可能提供了将结构体对象序列化为字节数组,以及从字节数组反序列化回结构体的功能,这对于网络通信或存储数据到磁盘非常有用。 5. **兼容性与效率**: 由于JavaStruct库是为了...

    javaStruct

    JavaStruct 是一个库,它允许Java开发者以类似C语言结构体(C-style structs)的方式处理Java对象。这个库特别适用于与嵌入式设备和其他使用C风格结构体的应用进行网络协议交互的情况。通过JavaStruct,程序员可以...

    struct和union计算方法

    2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的...

    MapStructDemo入门篇

    MapStruct是一款优秀的代码生成工具,专门用于简化对象到对象之间的映射转换。它通过自动化的编译时处理,极大地减少了手动编写映射代码的工作量,尤其在处理复杂对象转换时,能够显著提升开发效率和代码质量。在本...

    MapStruct 1.2.0 参考指南

    MapStruct是一款非常流行的Java注释处理器,主要用于简化Java对象(也称为Java Bean)之间的映射操作。它通过在编译时自动生成源对象到目标对象的映射代码,提高了开发效率并减少了手动编写映射代码时可能出现的错误...

    test_x2struct.rar

    x2struct的这一部分功能涉及到解析JSON对象,识别键值对,并将它们转换为struct的实例。这可能涉及到JSON解析库(如nlohmann/json或jsoncpp)的使用,以及理解如何将JSON对象映射到C++的struct。 在压缩包中,...

Global site tag (gtag.js) - Google Analytics