美文网首页
From Objective-C to Ruby(2)-数据类型

From Objective-C to Ruby(2)-数据类型

作者: 求墨者 | 来源:发表于2018-08-27 16:16 被阅读10次

两者对比

Objective-C Ruby
NSNumber Number
NSMutableString String
NSRange Range
NSMutableArray Array
NSMutableDictionary Hash
NSString Symbol

数字

四则运算

OC:

printf("%d\n", (10 + 3));    // => 13
printf("%d\n", (10 - 3));    // => 7
printf("%d\n", (10 * 3));    // => 30
printf("%d\n", (10 / 3));    // => 3
printf("%f\n", (10.0 / 3));  // => 3.333333
printf("%f\n", (10 / 3.0));  // => 3.333333
printf("%d\n", (10 % 3));    // => 1

NSLog(@"%@", @( (10.0/3.0) ) );   // => 3.333333333333333

ruby:

puts 10 + 3    # => 13
puts 10 - 3    # => 7
puts 10 * 3    # => 30
puts 10 / 3    # => 3
puts 10.0 / 3  # => 3.3333333333333335
puts 10 / 3.0  # => 3.3333333333333335
puts 10 % 3    # => 1
  • OCNSNumber不具有四则运算的方法,所以可以使用C语言的四则运算,再转换为OC的对象类型

查看对象类型

OC:

NSLog(@"%@", NSStringFromClass( @(5).class ) );  // => __NSCFNumber

ruby:

puts 5.class  # => Integer

浮点运算的不准确性

OC:

printf("%f\n", (3.51212 + 1)); // => 4.512120
printf("%d\n", ( 4.51212 == (3.51212 + 1) ));  // => 0

// NSDecimalNumber
NSDecimalNumber * d0 = [NSDecimalNumber decimalNumberWithString:@"4.51212"];
NSDecimalNumber * d1 = [NSDecimalNumber decimalNumberWithString:@"3.51212"];
NSDecimalNumber * d2 = [NSDecimalNumber decimalNumberWithString:@"1"];
NSDecimalNumber * d3 =  [d1 decimalNumberByAdding:d2];
printf("%d\n", ( d0.doubleValue == d3.doubleValue ));  // => 1

ruby:

puts (3.51212 + 1)   # => 4.5121199999999995
puts 4.51212 == (3.51212 + 1)  # => false

# bigdecimal
require 'bigdecimal'
puts BigDecimal("4.51212") == BigDecimal("3.51212") + BigDecimal("1")    # => true

问题:如何判断数字的奇偶数

OC:

int n=10;
if(n!=0 && n%2==0){
    NSLog(@"该数是偶数");
}else if(n%2==1){
    NSLog(@"该数是奇数");
}else{
    NSLog(@"该数是0");
}

ruby:

num = 10

if num % 2 == 0
    puts "偶数"
else
    puts "奇数"
end

puts 10.odd?    # => false
puts 10.even?   # => true

问题:数字如何四舍五入保留两位小数

OC:

printf("%.2f\n",3.333); // => 3.333
printf("%.2f\n",4.518); // => 4.518

ruby:

puts 3.333.round(2)   # => 3.33
puts 4.518.round(2)   # => 4.52

字符串

使用方法

OC:

NSMutableString * name = @"编程".mutableCopy;

ruby:

name = "编程"

字符串修改

OC:

NSMutableString * name = @"小明".mutableCopy;
NSNumber * age = @(18);

NSMutableString * tmpStr = @"你好,我是".mutableCopy;
[tmpStr appendString:name];
[tmpStr appendString:@",我今年"];
[tmpStr appendString:age.stringValue];
[tmpStr appendString:@"岁"];
NSLog(@"%@", tmpStr); // 你好,我是小明,我今年18岁

NSLog(@"你好,我是%@,我今年%@岁", name, age); // 你好,我是小明,我今年18岁

字符串 => 数组

ruby:

name = "小明"
age = 18

puts "你好,我是" + name + ",我今年" + age.to_s + "岁" # => 你好,我是小明,我今年18岁

puts "你好,我是#{name},我今年#{age}岁" # => 你好,我是小明,我今年18岁

引号中的引号

OC:

NSLog(@"\"小明\""); // "小明"

ruby:

puts "\"小明\""
puts %q("小明") 
puts %Q("小明")

范围

OC:

NSRange range = NSMakeRange(0, 10);
NSLog(@"位置:%ld  长度:%ld", range.location, range.length); // # => 位置:0  长度:10

ruby:

(1..5).to_a   # 1 到 5
(1...5).to_a  # 1 到 4

('a'..'z').to_a
('A'..'Z').to_a

  • OC的NSRange是结构体,ruby的Range的对象
  • NSRange常用于字符串截取
  • Range可转为Array

数组

数组初始化

OC:

NSMutableArray * thoughts = @[@"儒家", @"道家", @"墨家", @"法家"].mutableCopy;

ruby:

thoughts = ["儒家", "道家", "墨家", "法家"]

数组取值

OC:

NSMutableArray * thought = @[@"儒家", @"道家", @"墨家", @"法家"].mutableCopy;
NSLog(@"%@", thought[1]); // => 道家
NSLog(@"%@", thought.firstObject); // => 儒家
NSLog(@"%@", thought.lastObject); // => 墨家

ruby:

thoughts = ["儒家", "道家", "墨家", "法家"]
p thoughts[1] # => 道家
p thoughts[-1] # => 法家
p thoughts.first # => 儒家
p thoughts.last # => 法家
  • ruby索引值可为负数,代表方向取值

问题:把数组 [1, 2, 3, 4, 5] 变成 [1, 3, 5, 7, 9]

OC:

NSMutableArray * arr = @[@(1), @(2), @(3), @(4), @(5)].mutableCopy;
NSMutableArray * arr2 = @[].mutableCopy;
[arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSNumber * num = obj;
    NSInteger i = num.integerValue;
    [arr2 addObject:@( (i * 2 - 1) )];
}];
NSLog(@"%@", arr2);//  =>  (1, 3, 5, 7, 9)

ruby:

list = [1, 2, 3, 4, 5]
list.map { 
    |i| i * 2 - 1 
}
p list # [1, 3, 5, 7, 9]

哈希

hash的生成和取值

OC:

NSMutableDictionary * thoughtDict = @{
                               @"儒家": @"孔子",
                               @"道家": @"老子",
                               @"墨家": @"墨子"
                               }.mutableCopy;
NSLog(@"%@",thoughtDict[@"道家"]); // => 老子

ruby:

thought_hash = {
    儒家: "孔子",
    道家: "老子",
    墨家: "墨子"
}

puts th_hash[:道家] # => 老子

hash的所有键和所有值

OC:

NSMutableDictionary * thoughtDict = @{
                               @"儒家": @"孔子",
                               @"道家": @"老子",
                               @"墨家": @"墨子"
                               }.mutableCopy;
NSLog(@"%@",thoughtDict.allKeys);
/*
*/

NSLog(@"%@",thoughtDict.allValues);
/*
*/

[thoughtDict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    NSLog(@"%@", key);
    NSLog(@"%@", obj);
}];

ruby:

thought_hash = {
    儒家: "孔子",
    道家: "老子",
    墨家: "墨子"
}

puts thought_hash.keys  # =>
puts thought_hash.values # =>

profile.each do |key, value|
  puts key
  puts value
end

符号

定义

OC:

NSString * hello = @"hello";

ruby:

:hello
  • Symbol 是不可变的对象
  • Symbol 是带变量名的对象

参考资料:
railsbook


  • 持续更新。
  • 若有更好的资料,感谢交流。
  • 若有错误的内容,感谢斧正。

相关文章

网友评论

      本文标题:From Objective-C to Ruby(2)-数据类型

      本文链接:https://www.haomeiwen.com/subject/iaktwftx.html