美文网首页
From Objective-C to Ruby(3)-方法和块

From Objective-C to Ruby(3)-方法和块

作者: 求墨者 | 来源:发表于2018-08-29 19:25 被阅读5次

方法

定义方法

OC:

// Demo.h

#import <Foundation/Foundation.h>

@interface Demo : NSObject
-(void)sayHelloTo:(NSString*)name;
@end
// Demo.m

#import "Demo.h"

@implementation Demo

-(void)sayHelloTo:(NSString*)name{
    NSLog(@"hello, %@", name);
}

@end

ruby:

def say_hello_to(name)
  puts "hello, #{name}"
end

调用方法

OC:

// main.m

#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
    @autoreleasepool {
        [[Demo new] sayHelloTo:@"帅哥"];
    }
}

ruby:

say_hello_to("帅哥") 

参数的默认值

OC:

// Demo.h

#import <Foundation/Foundation.h>

@interface Demo : NSObject
-(void)sayHelloTo:(NSString*)name;
@end
// Demo.m

#import "Demo.h"

@implementation Demo

-(void)sayHelloTo:(NSString*)name{
    if (!name) {
        name = @"美女";
    }
    NSLog(@"hello, %@", name);
}

@end
// main.m

#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
    @autoreleasepool {
        [[Demo new] sayHelloTo:nil];
    }
}
# ruby:

def say_hello_to(name="美女")
    puts "hello, #{name}"
end

方法的返回值

OC:

// Demo.h

#import <Foundation/Foundation.h>

@interface Demo : NSObject

-(NSString*)sayHelloTo:(NSString*)name;

@end
// Demo.m

#import "Demo.h"

@implementation Demo

-(NSString*)sayHelloTo:(NSString*)name{
    return name;
}

@end
// main.m

#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", [[Demo new] sayHelloTo:@"美女"]);
    }
}

ruby:

def say_hello_to(name="美女")
    return "hello, #{name}"
end

p say_hello_to

代码块

声明和调用块

OC:

dispatch_block_t sayHello;

sayHello = ^(){
    NSLog(@"这里是 Block");    
};

NSLog(@"开始");   
sayHello();
NSLog(@"结束");   

ruby:

def say_hello
    puts "开始"
    yield          # 把控制权暂时让给 Block
    puts "结束"
end

say_hello {
    puts "这里是 Block"
}

传参数给块

OC:

typedef void (^SayHello)(NSInteger);
SayHello sayHello;
    
sayHello = ^(NSInteger x){
    NSLog(@"这里是 Block,我收到了%ld", x);
};
    
NSLog(@"开始");
sayHello(123);
NSLog(@"结束");

ruby:

def say_hello
    puts "开始"
    yield 123        # 把控制权暂时让给 Block
    puts "结束"
end

say_hello { |x|
    puts "这里是 Block,我收到了#{x}"
}

块的回调

OC:

// 逻辑部分
typedef BOOL (^LogicBlock)(NSNumber *);
LogicBlock logic = ^BOOL(NSNumber * num){
    if (num.integerValue % 2==0) {
        return YES;
    }else {
        return NO;
    }
};

// Block
typedef NSArray* (^PickBlock)(NSArray*, LogicBlock);
PickBlock pick = ^(NSArray* list, LogicBlock logic){
    NSMutableArray * result = @[].mutableCopy;
    
    [list enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSNumber * num = obj;
        if (logic(num)) {
            [result addObject:num];
        }
    }];
    return [result copy];
};

// 得到结果
NSArray * dataList = @[@(1), @(2), @(3), @(4), @(5), @(6), @(7), @(8), @(9),@(10)];
NSLog(@"%@", pick(dataList, logic));// => (2, 4, 6, 8, 10)

ruby:

def pick(list)
    result = []
    list.each do |i|
        result << i if yield(i)     # 如果 yield 的返回值是 true 的話...
    end
    return result
end

p pick([*1..10]) {
    |x| x % 2 == 0 # 逻辑部分
  }
  # => [2, 4, 6, 8, 10]
  • 代码块的本质,就是将一块代码抽离出来
  • rubyblock是代码的直接替换代码,简单而又直观
  • objCblock是代码的间接来回指向,强调一来一回

参考资料:
railsbook
goshdarnblocksyntax


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

相关文章

网友评论

      本文标题:From Objective-C to Ruby(3)-方法和块

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